前几天,我拿到了我的Microsoft Arc Touch Mouse Surface Edition。不幸的是,它没有前进/后退按钮(它只执行Page-Up / Page-Down)。
所以,我写了一个小程序,它抓住了Page_Up / Page_Down键的按键,而是发送了Browser-Back / -Forward Button.
在我的电脑上(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));
}
这里是KeyboardHook:
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() - Method。 0xA6和0xA7是Browser_Back和Browser_Forward的密钥代码。
在我的Surface上,可以正确识别Page-Up / Page-Down按钮。 send() - Method也被调用,但它不会发送正确的密钥代码。根据Spy ++,如果Keycode是0xA6或0xA7(在我的电脑上工作),send()不会发送任何内容。
Surface Pro 2的问题在哪里?我能做什么,它有效,或者我怎么能确定它为什么不起作用?
答案 0 :(得分:0)
您发布的代码错误,因为您从未为type
设置input2
(代码使用structure.type
)
编辑:
来自SendInput的MSDN文档:
当UIPI阻止此功能失败时。请注意,都没有 GetLastError和返回值都表示失败 通过UIPI阻止。
此功能受UIPI约束。申请被允许注入 仅输入相同或较低完整性的应用程序 水平。
您还应该删除对GetMessageExtraInfo
新编辑:
我不喜欢你的KeyHookProc
函数的逻辑:如果消息不是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;
}