Я использую PostMessage
для отправки ключей к мини-файлу firefox. Этот код ниже отлично работает для символов верхнего уровня, но когда я отправляю строчный регистр, он отправляет 3 каждого отправленного символа.Почему PostMessage отправляет несколько ключей при отправке строчных ключей?
Это вырезанный пример отправки символа «c». Я знаю его не firefox, потому что он делает то же самое в блокноте.
Это spy++
выход, когда я вручную отправить вход в окно
<000001> 000204B6 P WM_KEYDOWN nVirtKey:'C' cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000002> 000204B6 P WM_CHAR chCharCode:'99' (99) cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000003> 000204B6 P WM_KEYUP nVirtKey:'C' cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:1 fUp:1
Это spy++
выход, когда мой код отправляет его
<000001> 000906D4 P WM_KEYDOWN nVirtKey:'C' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000002> 000906D4 P WM_CHAR chCharCode:'99' (99) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000003> 000906D4 P WM_KEYUP nVirtKey:'C' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000004> 000906D4 P WM_CHAR chCharCode:'99' (99) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000005> 000906D4 P WM_CHAR chCharCode:'99' (99) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
Что я делаю неправильно здесь?
[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;
IntPtr val = new IntPtr((Int32)'c');
PostMessage(WindowHandle, WM_KEYDOWN, (IntPtr)(val - 0x020), new IntPtr(0));
PostMessage(WindowHandle, WM_CHAR, (IntPtr)val, new IntPtr(0));
PostMessage(WindowHandle, WM_KEYUP, (IntPtr)(val - 0x020), new IntPtr(0));
Я получаю сообщение «cc» и вывод spy ++ по-прежнему выглядит неправильно. Мне нужно правильно понять lParam, я думаю, его просто все очень чуждо мне, поскольку я новичок в разработке C#/desktop. – jamie
У меня теперь есть Lparam и Wparam от Spy ++, но не знаю, как их использовать! PostMessage (WindowHandle, WM_KEYDOWN, (IntPtr) (00000041), (IntPtr) (001E0001)); PostMessage (WindowHandle, WM_CHAR, (IntPtr) (00000061), (IntPtr) (001E0001)); PostMessage (WindowHandle, WM_KEYUP, (IntPtr) (00000061), (IntPtr) (C01E0001)); – jamie
PostMessage (WindowHandle, WM_KEYDOWN, (IntPtr) (0x00000041), (IntPtr) (0x001E0001)); PostMessage (WindowHandle, WM_CHAR, (IntPtr) (0x00000061), (IntPtr) (0x001E0001)); PostMessage (WindowHandle, WM_KEYUP, (IntPtr) (0x00000061), (IntPtr) (0xC01E0001)); Это дает мне алгоритмическое переполнение ... – jamie