3

首先,我正在尝试将键盘输入发送到后台应用程序(一个没有焦点或什至可能对用户不可见的窗口)。

我已经验证 winHandle 和常量是正确的。问题是后台应用程序似乎没有收到消息,除非我在 PostMessage() 行设置了一个断点,当它到达那里时按 F10(跳过)或 F5(继续),然后按键神奇地被发送.

是什么赋予了?相关代码:

    [DllImport("User32.Dll", EntryPoint = "PostMessageA", SetLastError = true)]
    public static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

    PostMessage(winHandle, (uint)WM_KEYDOWN, 66, 0);

使用 Win7 64 和 MS Visual Studio 2008 pro,控制台应用程序。如果有帮助,上面的代码就在线程上。

4

1 回答 1

3

使用Win7 64

这有点相关,声明是错误的。在 32 位模式下工作,但在 64 位模式下很麻烦。最后两个参数是指针,而不是整数。8 个字节,而不是 4 个。修复:

[DllImport("User32.Dll", EntryPoint = "PostMessageA", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

PostMessage(winHandle, (uint)WM_KEYDOWN, (IntPtr)66, IntPtr.Zero);

但是,这实际上可能无法解决您的问题。在 x64 模式下,非实例方法的前 4 个参数在寄存器中传递,而不是在堆栈中。碰巧这个方法有 4 个参数,你不会收到 PInvokeStackImbalance MDA 警告。并且 64 位寄存器值的高 32 位经常意外为零,因此 P/Invoke 编组器生成 32 位或 64 位参数值并不重要。

请注意,这种方法在实践中相当麻烦。您无法控制目标进程中键盘的状态。您正在发送 B 的击键。这可能会变成 B、b、Alt+B 或 Ctrl+B,具体取决于修饰键的状态。只有 SendInput() 可以可靠地工作。好吧,从窗口焦点问题来看。

于 2010-11-27T17:07:41.000 回答