C ++ winapi: come utilizzare SendMessage/PostMessage wm_keydown lparam
-
25-09-2019 - |
Domanda
Come dilettante a qualcosa di inferiore a VB/VBS (C ++ winapi è un incubo per qualcuno della mia esperienza) non ho idea di come costruire il lungo LPARAM per un semplice messaggio di keydown in C ++ e probabilmente ho trascorso più tempo a cercare un Spiegazione decente di quanto vale, qualcuno sarebbe in grado di descrivere esattamente come procedere?
Sembra che quasi ogni risposta a questa domanda in altri forum sia stata invece "perché" o "usa invece SendInput", senza rispondere alla domanda; Immagino che sia troppo elementare che le persone lo spiegano. Comunque ecco la descrizione di MSDN, apprezzerebbe moltissimo una spiegazione o un collegamento decente a una e un esempio funzionato, se possibile:
Il conteggio di ripetizione, il codice di scansione, il flag esteso, il codice di contesto, il flag-stato chiave e il flag di transizione, come mostrato ...
0-15 Il conteggio di ripetizione per il messaggio corrente. Il valore è il numero di volte in cui il taccuino viene autorefettato a seguito dell'utente che tiene giù la chiave. Se il tasto è tenuto abbastanza a lungo, vengono inviati più messaggi. Tuttavia, il conteggio delle ripetizioni non è cumulativo. 16-23 Il codice di scansione. Il valore dipende dall'OEM.
24 indica se la chiave è una chiave estesa, come i tasti ALT e CTRL di destra che compaiono su una tastiera migliorata a 101 o 102 tastie. Il valore è 1 se è una chiave estesa; Altrimenti, è 0. 25-28 riservato; non usare
29 Il codice di contesto. Il valore è 1 se il tasto ALT è giù mentre il tasto viene premuto; È 0 se il messaggio wm_syskeydown viene pubblicato nella finestra attiva perché nessuna finestra ha il focus della tastiera.
30 Lo stato chiave precedente. Il valore è 1 se la chiave è in calo prima che il messaggio venga inviato o è 0 se la chiave è aumentata.
31 Lo stato di transizione. Il valore è sempre 0 per un messaggio WM_SYSKEKEDODODOD.
Soluzione
Dalla spiegazione di lparam parametro di wm_keydown messaggio e Flag di messaggi di tastiera Capitolo, scriverei il seguente codice per gestire il valore di lparam:
iRepeatCount := LOWORD(lParam);
iScanCode := HIWORD(lParam) and $FF;
iExtendedKey := (HIWORD(lParam) and KF_EXTENDED) shr 8;
iContextCode := (HIWORD(lParam) and KF_ALTDOWN) shr 13;
iPreviousState := (HIWORD(lParam) and KF_REPEAT) shr 14;
iKeyDown := (HIWORD(lParam) and KF_UP) shr 15;
Sebbene sia l'implementazione di Delphi, sono sicuro che puoi capire un codice così semplice. :-)
Ok, per vostra comodità, google per shr
istruzioni equivalenti in VB, e ottengo questo:
Private Function SHL(ByVal inVal As Long, ByVal inShift As Byte) As Long
SHL = inVal * (2 ^ inShift) ' Bit shift left
End Function
Private Function SHR(ByVal inVal As Long, ByVal inShift As Byte) As Long
SHR = inVal \ (2 ^ inShift) ' Bit shift right
End Function
Imitare il LOWORD
e HIWORD
In VB, vedi Come imitare le macro Hiword, Loword, Hibyte, Lobyte C in VB.
Altri suggerimenti
http://msdn.microsoft.com/en-us/library/ms646280(vs.85).aspx
LPARAM è un valore di 32 bit; Ogni bit controlla un aspetto diverso del messaggio WM_Keydown. Per compilare correttamente LPARAM, potresti provare a usare Spy ++ per vedere come sono i messaggi reali WM_Keydown.