【问题标题】:How do I use these PostMessage Lparam and Wparam's?我如何使用这些 PostMessage Lparam 和 Wparam 的?
【发布时间】:2016-10-20 17:16:03
【问题描述】:

我真的很难理解 PostMessage 的工作原理。我来自网络开发背景,所以对我来说这一切都很陌生。我正在尝试将单个“a”字符发送到第三方应用程序。我已经使用 spy++ 来获取所需的 PostMessage(下面的参数),但我无法理解如何使用 Lparam 和 Wparam。

这是我目前所拥有的。我假设 00000041(以及来自 spy++ 的其他人)实际上是十六进制的,我将 0x 放在它的字体中是正确的吗?

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);    

const int WM_KEYDOWN = 0x100;
const int WM_KEYUP   = 0x101;
const Int32 WM_CHAR  = 0x0102;

PostMessage(WindowHandle, WM_KEYDOWN, (IntPtr)(0x00000041), (IntPtr)(0x001E0001)); 
PostMessage(WindowHandle, WM_CHAR, (IntPtr)(0x00000061), (IntPtr)(0x001E0001)); 
PostMessage(WindowHandle, WM_KEYUP, (IntPtr)(0x00000041), (IntPtr)(0xC01E0001)); 

这给了我一个算法溢出......

在有人告诉我使用 sendinput 之前,这是一个没有焦点的窗口:-p

【问题讨论】:

  • 抱歉应该指定。 PostMessage(WindowHandle, WM_KEYUP, (IntPtr)(0x00000061), (IntPtr)(0xC01E0001));
  • 0xC01E0001 故意的,0xC 在最后一个 PostMessage 中而不是 0x0
  • lParam 参数是干什么用的?我找不到它的文档。有时我看到它设置为 1,其他时候设置为 0

标签: c# c++ windows unmanaged postmessage


【解决方案1】:

您不发送WM_CHARWM_CHAR 由应用程序在TranslateMessage 中合成 - 即应用程序将其发布给自己。要么只发送 WM_CHAR,要么只发送 WM_KEYDOWN 和 WM_KEYUP。如果发送 KEYUP,您需要延迟以允许应用程序在您发送 KEYDOWN 之前合成 WM_CHAR,否则它们将被乱序处理。即使这样,您也会遇到异步键状态的问题。但总而言之:您无法使用PostMessage 合成键盘输入。

以下是一些背景资料:

您最好的选择可能是将应用程序置于前台并使用SendInput

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多