我如何使用这些PostMessage Lparam和Wparam?

时间:2016-06-19 09:28:35

标签: c# c++ windows unmanaged postmessage

我真的很难理解PostMessage的工作原理。我来自web开发人员背景,所以对我来说都是非常陌生的。我正在尝试向第三方应用程序发送一个“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

1 个答案:

答案 0 :(得分:1)

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

这里有一些背景阅读:

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