在远程桌面会话中处理之前处理关键事件

时间:2016-07-22 11:23:55

标签: c# keyboard remote-desktop

我有一个关键的监听器来处理按键并对其进行操作。例如,CTRL + ALT + 1在键监听器中执行某个功能。当我打开远程桌面会话时,一些关键事件将由远程桌面直接处理。

对于我的应用程序来说,即使用户正在远程桌面会话中工作,每个关键事件都要处理也很重要。

澄清:

PC1:

  • 运行键盘钩子应用程序
  • 运行一些应用程序
  • 其中一个应用程序是到PC2的远程桌面会话

PC2:

  • 与这台PC正在做什么无关

当我按下PC1上的某个键时,我希望能够对其进行操作,因此,键盘挂钩应用程序。这工作正常,直到我的远程桌面会话具有焦点。在这种情况下,“某些”键由远程桌面直接处理,而不将事件传递给我的键盘钩子应用程序。

是否有解决方案在将关键事件发送到远程桌面之前捕获它们?

我到目前为止的关键钩子应用程序:

    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_KEYUP = 0x0101;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;

    public static void Main()
    {
        keyMapper = new KeyMapper();

        _hookID = SetHook(_proc);
        Application.Run();
        UnhookWindowsHookEx(_hookID);
    }

    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                GetModuleHandle(curModule.ModuleName), 0);
        }
    }

    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        // handle key events
    }

0 个答案:

没有答案