1

VB/VBS よりも低いものに対するアマチュアとして (C++ WINAPI は私の経験のある人にとっては悪夢です)、C++ で単純な KEYDOWN メッセージの長い lParam を構築する方法がわかりません。価値があるよりもまともな説明ですが、誰かがこれをどのように行うかを正確に説明できますか?

他のフォーラムでのこの質問に対するほとんどすべての回答は、実際に質問に回答することなく、「理由」または「代わりに SendInput を使用する」であったようです。人々が説明するにはあまりにも初歩的すぎると思います。とにかく、ここにmsdnからの説明があります。適切な説明またはリンク、および可能であれば実際の例をいただければ幸いです。

示されているように、繰り返し回数、スキャン コード、拡張キー フラグ、コンテキスト コード、前のキー状態フラグ、および遷移状態フラグ...

0-15 現在のメッセージの繰り返し回数。この値は、ユーザーがキーを押した結果、キーストロークが自動反復される回数です。キーストロークが十分長く保持されると、複数のメッセージが送信されます。ただし、繰り返し回数は累積されません。16-23 スキャンコード。値は OEM によって異なります。

24 キーが拡張キー (拡張 101 キーまたは 102 キー キーボードに表示される右側の ALT キーおよび CTRL キーなど) であるかどうかを示します。拡張キーの場合、値は 1 です。それ以外の場合は 0 です。 25 ~ 28 予約済み。使用禁止

29 コンテキストコード。キーが押されている間に Alt キーが押されている場合、値は 1 です。どのウィンドウにもキーボード フォーカスがないため、アクティブなウィンドウに WM_SYSKEYDOWN メッセージが送信された場合は 0 です。

30 前のキーの状態。メッセージが送信される前にキーが押されていない場合、値は 1 です。キーが押されている場合、値は 0 です。

31 遷移状態。WM_SYSKEYDOWN メッセージの場合、値は常に 0 です。

4

2 に答える 2

1

WM_KEYDOWNメッセージのlParamパラメータとキーストローク メッセージ フラグの章の説明から、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;

Delphi の実装ですが、このような単純なコードは理解できると思います。:-)

OK、便宜上、shrVB で同等の命令をグーグルで検索すると、次のようになります。

  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

LOWORDVB でandを模倣するには、「VB でHIWORD、LOWORD、HIBYTE、LOBYTE C マクロを模倣する方法」をHIWORD参照してください。

于 2010-10-23T18:53:29.857 に答える
0

http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx

lparam は 32 ビット値です。各ビットは、WM_KEYDOWN メッセージのさまざまな側面を制御します。lparam を正しく入力するには、spy++ を使用して、実際の WM_KEYDOWN メッセージがどのように表示されるかを確認してください。

于 2010-10-23T19:16:03.450 に答える