2016-06-19 14 views
2

Я использую 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)); 
+0

Я получаю сообщение «cc» и вывод spy ++ по-прежнему выглядит неправильно. Мне нужно правильно понять lParam, я думаю, его просто все очень чуждо мне, поскольку я новичок в разработке C#/desktop. – jamie

+0

У меня теперь есть 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

+0

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

ответ

1

Показанный выше. Все, что мне нужно, было ниже!

char Letter = 'a'; 
PostMessage(WindowHandle, WM_CHAR, (IntPtr)Letter, new IntPtr(0));