Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#p/invoke为键组合ALT+注册hotkey;选项卡不工作(返回0)_C#_Pinvoke_Wndproc_Registerhotkey - Fatal编程技术网

C#p/invoke为键组合ALT+注册hotkey;选项卡不工作(返回0)

C#p/invoke为键组合ALT+注册hotkey;选项卡不工作(返回0),c#,pinvoke,wndproc,registerhotkey,C#,Pinvoke,Wndproc,Registerhotkey,我正在使用以下代码截取c#应用程序中的ALT+TAB键序列 一些相关片段: [DllImport("user32.dll")] private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); 及 及 在第二个代码段中,ret几乎为false,但是当我用MOD_SHIFT(0x04)替换MOD_ALT(0x01)时,ret变为true,热键截取工作 我想知道为什么会出现这种情况,因为

我正在使用以下代码截取c#应用程序中的ALT+TAB键序列

一些相关片段:

[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

在第二个代码段中,ret几乎为false,但是当我用MOD_SHIFT(0x04)替换MOD_ALT(0x01)时,ret变为true,热键截取工作


我想知道为什么会出现这种情况,因为我在web上看到的许多示例都表明它们是有效的。

也许您不能传递Id参数的
0
?请参阅下面的链接,该链接指定IDH_ALTTAB、IDH_NEXT或IDH_PREV。这和…我不知道


可能您无法传递Id参数的
0
?请参阅下面的链接,该链接指定IDH_ALTTAB、IDH_NEXT或IDH_PREV。这和…我不知道


以管理员身份运行修复了它。

以管理员身份运行修复了它。

好吧,您想要截获的组合是一个系统范围的热键-我认为这在当前的Windows版本中不起作用,因为如果这样做了,将造成巨大的安全问题…它是一个基本的Windows快捷方式,类似于Ctrl+Esc。“一个过程不允许如此具有破坏性。”汉斯,我认为你错了。MSDN:“在Windows XP之前,尝试将AltTab注册为热键将失败。在Windows XP中,不仅可以成功将AltTab注册为热键,Windows XP还允许您自己处理此事件,而不是启动其内置的AltTab热键处理程序。”我的经验是,您可以在Windows XP下将Alt+Tab注册为热键,但不能在Windows 7下注册。非常令人沮丧的是,他们不再允许这样做,因为这会使编写自定义Alt+Tab切换器变得更加困难。AFAIK您想要拦截的组合是一个系统范围的热键-我希望这在当前的Windows版本中不起作用,因为如果这样做,将带来巨大的安全问题…这是一个基本的Windows快捷方式,类似于Ctrl+Esc。“一个过程不允许如此具有破坏性。”汉斯,我认为你错了。MSDN:“在Windows XP之前,尝试将AltTab注册为热键将失败。在Windows XP中,不仅可以成功将AltTab注册为热键,Windows XP还允许您自己处理此事件,而不是启动其内置的AltTab热键处理程序。”我的经验是,您可以在Windows XP下将Alt+Tab注册为热键,但不能在Windows 7下注册。非常令人沮丧的是,他们不再允许这样做,因为这使编写自定义Alt+制表符切换器变得更加困难。我认为这些常量(例如IDH_ALTTAB)是用户定义的常量的占位符,但在示例中没有显示。但是,0很可能不是有效的id。我认为这些常量(例如IDH_ALTTAB)是用户定义的常量的占位符,但在示例中没有显示。但是,0很可能不是有效的id。
bool ret = RegisterHotKey(this.Handle, 0, MOD_ALT, 0x09);
Console.WriteLine("return value:" + ret);
Console.WriteLine("lasterror=" + Marshal.GetLastWin32Error());
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_HOTKEY)
        {
            MessageBox.Show("Generic hotkey interception");
            if (m.WParam.ToInt32() == 0)
            {
                MessageBox.Show("ALT+TAB intercepted");
            }
        }
        base.WndProc(ref m);
    }