Spy++을 이용하면 특정윈도우핸들에 보낸 메세지(WM_KEYDOWN + VK_ESCAPE)가 나타남을 확인할수 있다.
/*
1. 목적: A라는 대상 Utility의 기능들을 B라는 다른 Utility에서
Window Message(SendMessage)를 통해 제어하는 방법과 실험을 실시.
2. 구현 - 간략 설명.
A.EXT : SPY++로 Caption Title을 찾아 FindWindow로 핸들을 찾아와,
SendMessage로 해당 핸들에 메세지 및 W/L param를 전송한다.
3. 구현 - 코드
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Xml;
using System.Text.RegularExpressions;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
class Program
{
public static void Main(string[] args)
{
Application.Run(new KAKAONM());
}
}
class KAKAONM : Form
{
[DllImport("user32.dll")]public static extern int FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]public static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);
const int WM_KEYDOWN = 0x0100;
const int VK_ESCAPE = 0x1B;
public DialogResult InputBox(string title, string content, ref string value)
{
Form form = new Form();
PictureBox picture = new PictureBox();
Label label = new Label();
TextBox textBox = new TextBox();
Button buttonOk = new Button();
Button buttonCancel = new Button();
form.ClientSize = new Size(300, 100);
form.Controls.AddRange(new Control[] { label, picture, textBox, buttonOk, buttonCancel });
form.FormBorderStyle = FormBorderStyle.FixedDialog;
form.StartPosition = FormStartPosition.CenterScreen;
form.MaximizeBox = false;
form.MinimizeBox = false;
form.AcceptButton = buttonOk;
form.CancelButton = buttonCancel;
form.Text = title;
picture.SizeMode = PictureBoxSizeMode.StretchImage;
label.Text = content;
textBox.Text = value;
buttonOk.Text = "확인";
buttonCancel.Text = "취소";
buttonOk.DialogResult = DialogResult.OK;
buttonCancel.DialogResult = DialogResult.Cancel;
picture.SetBounds(10, 10, 50, 50);
label.SetBounds(65, 17, 200, 20);
textBox.SetBounds(65, 40, 220, 20);
buttonOk.SetBounds(135, 70, 70, 20);
buttonCancel.SetBounds(215, 70, 70, 20);
DialogResult dialogResult = form.ShowDialog();
value = textBox.Text;
return dialogResult;
}
public KAKAONM()
{
//
}
protected override bool ProcessCmdKey(ref Message message, Keys keyData)
{
switch (message.Msg)
{
case WM_KEYDOWN:
if (keyData.ToString() == "Escape")
{
Application.Exit();
}
else if (keyData.ToString() == "Space")
{
//
}
else if (keyData.ToString() == "Return")
{
string HEXAVALUE = "";
int VALUE10 = 0;
IntPtr HANDLENM = IntPtr.Zero;
if (InputBox("HEXA CODE", "VALUE", ref HEXAVALUE) == DialogResult.OK)
{
VALUE10 = Convert.ToInt32(HEXAVALUE, 16);
Console.WriteLine(VALUE10.ToString());
HANDLENM = Marshal.StringToHGlobalAuto(HEXAVALUE);
Console.WriteLine(HANDLENM.ToString() + "");
//SendMessage(HANDLENM, WM_KEYDOWN, VK_ESCAPE, 0);
// [DllImport("user32.dll")]public static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);에 선언되어진 입력데이타 파라미터를 준수함.
SendMessage(VALUE10, WM_KEYDOWN, VK_ESCAPE, 0);
}
}
break;
default:
break;
}
return base.ProcessCmdKey(ref message, keyData);
}
}