0

数日前、Microsoft Arc Touch Mouse Surface Edition を入手しました。残念ながら、進む/戻るボタンはありません (ページアップ/ページダウンのみを実行します)。

そこで、Page_Up/Page_Down キーの押下をキャッチし、代わりにブラウザの戻る/進むボタンを送信する小さなプログラムを作成しました。

私の PC (Win 8.1 Pro) では、これは非常にうまく機能します。ただし、私の Surface Pro 2 (プログラムが主に作成されたもの) では、Browser_Back-/Forward-Buttons は送信されません。他のすべてのキー (スペース、文字、数字など) では、プログラムは機能しているようです。

キーコードを送信するためのコードは次のとおりです。

      public static uint send(short keyCode) {

        INPUT structure = new INPUT();
        structure.type = (int)InputType.INPUT_KEYBOARD;
       structure.ki.wVk = keyCode;

        structure.ki.dwFlags = (int)KEYEVENTF.KEYDOWN;
        structure.ki.dwExtraInfo = GetMessageExtraInfo();

        INPUT input2 = new INPUT();
        structure.type = (int)InputType.INPUT_KEYBOARD;
        structure.ki.wVk = keyCode;

        input2.mi.dwFlags = (int)KEYEVENTF.KEYUP;
        input2.ki.dwExtraInfo = GetMessageExtraInfo();

        INPUT[] pInputs = new INPUT[] { structure, input2 };

        return SendInput(2, pInputs, Marshal.SizeOf(structure));
    }

そして、ここではキーボードフック:

       public static int KeyHookProc(int nCode, IntPtr wParam, IntPtr lParam) {

        KeyHookStruct myKeyHookStruct =
            (KeyHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyHookStruct));

        if (nCode < 0) {
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        } else {

            if (wParam == (IntPtr)0x0100) {


                int keyCode = myKeyHookStruct.vkCode;
                if (keyCode == 33) {

                    Input.send(0xA7);
                } else if (keyCode == 34) {

                    Input.send(0xA6);
                } else {
                    return CallNextHookEx(hHook, nCode, wParam, lParam);
                }


            }

            return 1;

        }

    }

したがって、キーボードの Page-Down/Page-Up ボタンが押されると、send() メソッドが呼び出されます。0xA6 と 0xA7 は、Browser_Back と Browser_Forward のキーコードです。

私の Surface では、Page-Up/Page-Down ボタンが正しく認識されます。send() メソッドも呼び出されますが、正しいキーコードは送信されません。Spy++ によると、キーコードが 0xA6 または 0xA7 の場合、send() は何も送信しません (私の PC では動作します)。

Surface Pro 2 の問題はどこにありますか? 機能すること、または機能しない理由をどのように判断できますか?

4

1 に答える 1

0

type設定したことがないため、投稿したコードは間違っていますinput2(コードの使用structure.type

編集:

SendInputの MSDN ドキュメントから:

この関数は、UIPI によってブロックされている場合に失敗します。GetLastError も戻り値も、​​失敗が UIPI ブロッキングによって引き起こされたことを示していないことに注意してください。

この関数は UIPI に従います。アプリケーションは、同等またはそれ以下の整合性レベルのアプリケーションにのみ入力を挿入できます。

への呼び出しも削除する必要がありますGetMessageExtraInfo

新しい編集:

KeyHookProc関数のロジックが気に入らない: メッセージが NOT WM_KEYDOWN(0x0100) の場合、1 を返す...

私は行きます:

if (wParam != (IntPtr)0x0100) {
   return CallNextHookEx(hHook, nCode, wParam, lParam);
} else {
   int keyCode = myKeyHookStruct.vkCode;
   if (keyCode == 33) {
      Input.send(0xA7);
   } else if (keyCode == 34) {
      Input.send(0xA6);
   } else {
      return CallNextHookEx(hHook, nCode, wParam, lParam);
   }
   return 1;
}
于 2014-01-02T11:42:42.807 に答える