2012-02-09 7 views
4

は私がClick + ShiftキーまたはClick + Altキー + シフトのように、Win32のマウスとキーボードのイベントを結合する必要があります。Win32のマウスとキーボードの組み合わせ

例えば(擬似コード):

case WM_LBUTTONDOWN: 

     if (Shift) 
      //click+Shift 
     if (Shift && Ctrl) 
      //click+Shift+Ctrl 
     if (Shift && Alt) 
      //click+Shift+Alt 
break; 

Iはherehereからすべての必要なパラメータを知っています。

しかし、それらを正しく組み合わせる方法はわかりません。

答えて

2

を:あなたが取得したいどのように深さに応じて、あなたはそうのように、内側のスイッチを持っているしたい場合があり

​​

Shiftキーとクリックして、ALTがありますあなたは別のやり方をとる必要があります。

どうしてそうですか? WM_LBUTTONDOWNページから、送信された信号ごとにパラメータが与えられていることがわかります。それらの1つはwparamです。いくつかの特殊キーが押されているかどうかによって異なる値を持つことができます

WM_LBUTTONDOWN信号のwparamにはaltボタンに関する情報が含まれていないため、上位ビット値を返す関数GetKeyStateを使用する必要がありますキーが押されている場合は1、それ以外の場合は何かを返します。私達は私達のWndProcメソッドのWM_KEYDOWNセクションにフラグを設定している私の現在のプロジェクトで

+1

「wParam == MK_SHIFT」ではなく「wParam&MK_SHIFT」と動作します。何が間違っていますか? – sysop

+1

正確な観察。私は私の答えに大きな誤植をしました。 Wparamにはビットフラグが含まれているので、論理ANDでチェックする必要があります。 混乱して申し訳ありません。 – Lefteris

+2

Hm ...あなたの質問に投稿したコードから、私はこれがあなたの意図した機能だと思った。これはプログラムフローの単なる問題です。私はそれを反映するために私の答えを修正します。 – Lefteris

1

GetKeyState関数を使用すると、現在のメッセージが生成された時点の修飾キーの状態を取得できます。従って:

if (GetKeyState(VK_SHIFT) < 0 && GetKeyState(VK_CONTROL) < 0) { 
    // click+shift+ctrl 
} else if (GetKeyState(VK_SHIFT) < 0) { 
    // click+shift 
} 

などです。 の前にの複数のキーの組み合わせがあるかどうかをチェックする必要があります。そうしないと、他の修飾キーが押されていても単一のシフトテストが成功します。

0

さっそくですが、wndprocにはいくつかのパラメータがあり、そのうちの1つはwParamです。 wParamは問題の仮想キーコードを持ちます。これはあなたのWINPROC内にあると仮定すると

switch (wParam) 
{ 
    case MK_CONTROL: 
    { 
     // handle mouse and ctrl key down 
     break; 
    } 
} 
0

case WM_KEYDOWN: 
{ 
switch(wParam) 
    { 
    case VK_CONTROL: 
     { 
      isHoldingCtrl = true; 
     } 
     break; 
    case VK_SHIFT: 
     { 
      isHoldingShift = true; 
     } 
     break; 
    case VK_NUMPAD1: 
     } 
      numPad = 1; 
     } 
     break; 
    } 
} 
break; 

これは、私たちは私たちが行う必要がある、修飾(例えば、テンキーキー)として任意のキーを使用することができますこのプロジェクトでは次に、WM_KEYUPに「通常の」キーイベントを定義します。

私はこれが必ずしもあなたの特定の問題に最適な解決策であると主張していませんが、別の選択肢であり、特定のニーズに適しています。

関連する問題