我如何使用这些 PostMessage Lparam 和 Wparam 的?
How do I use these PostMessage Lparam and Wparam's?
我真的很难理解 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
之前,这是针对 window 未聚焦的情况 :-p
您不发送 WM_CHAR
,WM_CHAR
由 TranslateMessage
中的应用程序合成 - 即应用程序将其发布给自己。要么只发送 WM_CHAR,要么只发送 WM_KEYDOWN 和 WM_KEYUP。如果发送 KEYUP,您需要延迟以允许应用程序在您发送 KEYDOWN 之前合成 WM_CHAR,否则它们将被乱序处理。即使那样你也会遇到异步键状态的问题。但总而言之:您无法使用 PostMessage
.
合成键盘输入
这里有一些背景资料:
https://blogs.msdn.microsoft.com/oldnewthing/20130531-00/?p=4203/
https://blogs.msdn.microsoft.com/oldnewthing/20130530-00/?p=4213/
https://msdn.microsoft.com/en-us/library/windows/desktop/ms646276(v=vs.85).aspx
您最好的选择可能是将应用程序置于前台并使用 SendInput
。
我真的很难理解 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
之前,这是针对 window 未聚焦的情况 :-p
您不发送 WM_CHAR
,WM_CHAR
由 TranslateMessage
中的应用程序合成 - 即应用程序将其发布给自己。要么只发送 WM_CHAR,要么只发送 WM_KEYDOWN 和 WM_KEYUP。如果发送 KEYUP,您需要延迟以允许应用程序在您发送 KEYDOWN 之前合成 WM_CHAR,否则它们将被乱序处理。即使那样你也会遇到异步键状态的问题。但总而言之:您无法使用 PostMessage
.
这里有一些背景资料:
https://blogs.msdn.microsoft.com/oldnewthing/20130531-00/?p=4203/
https://blogs.msdn.microsoft.com/oldnewthing/20130530-00/?p=4213/
https://msdn.microsoft.com/en-us/library/windows/desktop/ms646276(v=vs.85).aspx
您最好的选择可能是将应用程序置于前台并使用 SendInput
。