gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:42:48 24 4
gpt4 key购买 nike

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

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

最佳答案

Using 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() 可以可靠地工作。好吧,除了窗口焦点问题。

关于c# PostMessage 没有发送也没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4292613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com