2016-06-19 183 views
0

我真的很难理解PostMessage是如何工作的。我来自网络开发背景,所以对我来说都非常陌生。我试图发送一个“a”字符到第三方应用程序。我用spy ++来获得PostMessage(params以下),但我无法理解如何使用Lparam和Wparam。如何使用这些PostMessage Lparam和Wparam?

这是我到目前为止。我假设00000041(和其他间谍++)实际上是十六进制的,我正确地把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

+0

抱歉应该指定。 PostMessage(WindowHandle,WM_KEYUP,(IntPtr)(0x00000061),(IntPtr)(0xC01E0001)); – jamie

+0

在最后一个PostMessage中,'0xC01E0001'是故意的,'0xC'而不是'0x0'? – AEonAX

回答

1

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

这里的一些背景阅读:

您最好的选择可能是将应用ŧ前景并使用SendInput

相关问题