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);
    }
}








+ Recent posts