2
public partial class Form1 : Form
{
    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    public const Int32 WM_CHAR = 0x0102;
    public const Int32 WM_KEYDOWN = 0x0100;
    public const Int32 WM_KEYUP = 0x0101;
    public const Int32 VK_RETURN = 0x0D;

    public Form1()
    {
        InitializeComponent();
    }

    public bool working;

    private void button1_Click(object sender, EventArgs e)
    {
        Process[] proc = Process.GetProcessesByName("processname");

        if (proc[0] == null || proc.Length == 0)
        {
            Debug.WriteLine("Process not found.");
            return;
        }

        foreach (char c in textBox1.Text)
        {
            // char ascii value in decimal
            int charValue = c;

            // char ascii value in hex
            string hexValue = charValue.ToString("X");

            IntPtr val = new IntPtr(c);

            Debug.WriteLine(c + " = dec: " + charValue + ", hex: " + hexValue + ", val: " + val);

            PostMessage(proc[0].MainWindowHandle, WM_KEYDOWN, val, new IntPtr(0));
            PostMessage(proc[0].MainWindowHandle, WM_CHAR, val, new IntPtr(0));
            PostMessage(proc[0].MainWindowHandle, WM_KEYUP, val, new IntPtr(0));

            PostMessage(proc[0].MainWindowHandle, WM_KEYDOWN, new IntPtr(VK_RETURN), new IntPtr(0));
            PostMessage(proc[0].MainWindowHandle, WM_KEYUP, new IntPtr(VK_RETURN), new IntPtr(0));
        }
    } 
}

設定val = char 'm'した場合 (10 進数: 109、16 進数: 0x6D)、ウィンドウがメッセージを受け取ると、何らかの理由で文字 '-' が表示されます (12 進数 45、16 進数 0x2D)。最初は 16 進数/10 進数のフォーマットの問題を疑っていましたが、間違っていました。winapi の初心者として、私の問題は PostMessage() 構文にあるようです。ウィンドウに正しい文字を表示させるには、正しいメッセージを送信するにはどうすればよいですか?

4

2 に答える 2

4

0x6C と 108 は C# では同じもので、どちらも整数なので...

IntPtr val = new IntPtr(0x6C)

IntPtr val = new IntPtr(108)

機能的に同等です。

したがって、上記のコードでは、次を使用できるはずです。

IntPtr val = new IntPtr((Int32)c);
于 2012-07-06T16:53:35.883 に答える
1

私の混乱のすべての原因は、 のPostMessage構文にありましたWM_CHARwParamは標準の ASCII 16 進キーコードであると想定していましたが、そうではありませんでした。実際には (16 進数の)仮想キーコードでした。

これは、0x6D が「m」ではなくマイナスを送信していた理由を説明しています!

于 2012-07-06T18:40:14.920 に答える