2016-06-19 33 views
2

Ich verwende PostMessage, um Schlüssel an eine minimierte Firefox-Instanz zu senden. Dieser Code unten funktioniert gut für Großbuchstaben, aber wenn ich Kleinbuchstaben sende, scheint es 3 jedes gesendeten Zeichens zu senden.Warum sendet PostMessage beim Senden von Kleinbuchstaben mehrere Schlüssel?

Dies ist ein Kürzungsbeispiel für das Senden des Zeichens "c". Ich kenne es nicht firefox, weil es dasselbe im Notizblock tut.

Dies ist der spy++ Ausgang, wenn ich sende manuelle Eingabe an das Fenster

<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 

Dies ist der spy++ Ausgang, wenn mein Code sendet es

<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 

Was mache ich falsch hier?

[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

Ich bekomme "cc" gesendet und die Spion ++ Ausgabe sieht immer noch falsch aus. Ich muss das lParam richtig verstehen, ich denke, es ist alles sehr fremd für mich, da ich neu in C#/Desktop-Entwicklung bin. – jamie

+0

Ich habe jetzt die Lparam und Wparam von Spy ++, aber keine Ahnung, wie man sie benutzt! PostMessage (Fenstergriff, WM_KEYDOWN, (IntPtr) (00000041), (IntPtr) (001E0001)); PostMessage (WindowHandle, WM_CHAR, (IntPtr) (00000061), (IntPtr) (001E0001)); PostMessage (Fenstergriff, WM_KEYUP, (IntPtr) (00000061), (IntPtr) (C01E0001)); – jamie

+0

PostMessage (Fenstergriff, WM_KEYDOWN, (IntPtr) (0x00000041), (IntPtr) (0x001E0001)); PostMessage (WindowHandle, WM_CHAR, (IntPtr) (0x00000061), (IntPtr) (0x001E0001)); PostMessage (Fenstergriff, WM_KEYUP, (IntPtr) (0x00000061), (IntPtr) (0xC01E0001)); Das gibt mir einen algorithmischen Überlauf ... – jamie

Antwort

1

Das herausgefunden. Alles was ich brauchte war das unten!

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