无法通过SendInput()发送Browser_Back / Forward(仅限Surface Pro 2)

时间:2014-01-02 11:31:47

标签: c# sendinput

前几天,我拿到了我的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的问题在哪里?我能做什么,它有效,或者我怎么能确定它为什么不起作用?

1 个答案:

答案 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;
}