c#PostMessage没有发送也没有错误

时间:2010-11-27 16:26:31

标签: c# postmessage

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

我已经验证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上。

1 个答案:

答案 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()才能可靠地工作。好吧,从窗口焦点问题来看很短。