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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top