【问题标题】:c# PostMessage not sending and no errorc# PostMessage 不发送也没有错误
【发布时间】:2010-11-27 16:26:31
【问题描述】:

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

我已验证 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,控制台应用程序。如果有帮助,上面的代码在线程上。

【问题讨论】:

  • 可能是被发送的键是 F10 或 F5 ;)

标签: c# postmessage


【解决方案1】:

使用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() 可以可靠地工作。好吧,从窗口焦点问题开始。

【讨论】:

  • 啊哈!我现在一切都清楚了。击键实际上是被发送的,但由于按下了 ALT,目标应用程序没有正确解释它。看来我可能不得不采取另一种方法。
猜你喜欢
  • 2020-11-12
  • 1970-01-01
  • 2021-06-19
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2011-10-06
  • 2021-07-11
相关资源
最近更新 更多