数日前、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 の問題はどこにありますか? 機能すること、または機能しない理由をどのように判断できますか?