2016-06-19 5 views
0

Я действительно пытаюсь понять, как работает PostMessage. Я из фона веб-разработчиков, поэтому все это очень чуждо мне. Я пытаюсь отправить один «a» charcter в стороннее приложение. Я использовал spy ++ для получения PostMessage (параметры ниже), но я не могу понять, как использовать Lparam и Wparam.Как использовать эти 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

+0

извините, что из указанного. PostMessage (WindowHandle, WM_KEYUP, (IntPtr) (0x00000061), (IntPtr) (0xC01E0001)); – jamie

+0

Является ли '0xC01E0001' намеренным,' 0xC' вместо '0x0' в последнем PostMessage? – AEonAX

ответ

1

Вы не отправлять WM_CHAR, WM_CHAR синтезируется приложением в TranslateMessage - то есть приложение отправляет его самому себе. Либо отправляйте только WM_CHAR, либо отправляйте только WM_KEYDOWN и WM_KEYUP. Если вы отправляете KEYUP, у вас должна быть задержка, чтобы приложение могло синтезировать WM_CHAR перед отправкой KEYDOWN, или они будут обработаны не в порядке. Даже тогда у вас возникнет проблема с состоянием состояния асинхронного ключа. Однако длинный и короткий: вы не можете синтезировать ввод с клавиатуры, используя PostMessage.

Вот некоторые фоне чтения:

Лучше всего, вероятно, поставить приложение т o на переднем плане и используйте SendInput.

Смежные вопросы