首先, 我正在尝试将键盘输入发送到后台应用程序(一个没有焦点或者甚至可能看不到用户可见的窗口)。
我已经验证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,控制台应用程序。如果有帮助,上面的代码就在Thread上。
答案 0 :(得分:2)
使用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()才能可靠地工作。好吧,从窗口焦点问题来看很短。