C#全局密钥和SetForegroundWindow

本文关键字:SetForegroundWindow 密钥 全局 | 更新日期: 2023-09-27 17:58:49

我正在使用一个C#应用程序来监听一个全局键组合(ctrl+F9),它将把一个特定的窗口放在前面。

这是我用来将窗口放在前面的代码,它只有在被按钮事件触发时才有效:

    private void button3_Click(object sender, EventArgs e)
    {
        SetForegroundWindow(ptrActiveWindow.ToInt32());
        ShowWindowAsync(ptrActiveWindow, SW_RESTORE);
    }

对于勾手,我使用了从http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx,此处完整列出:

http://code.google.com/p/code-commenter/source/browse/trunk/key+预览/globalKeyboardHook.cs?spec=svn3&r=3

每当我在CTRL KeyDown之后和CTRL KeyUp之前(CTRL仍然被按下)发生F9 KeyUp事件时,我会调用我的方法:

    private void restore(IntPtr hWnd)
    {
      IntPtr ptrCurrentActiveWindow = GetForegroundWindow(); //comment line
      ShowWindowAsync(ptrCurrentActiveWindow, SW_MINIMIZE); //comment line
        ShowWindowAsync(hWnd, SW_RESTORE);
        SetFocus(hWnd);
        SetForegroundWindow(hWnd.ToInt32());
    }

这毫无作用。我的窗口在后台被激活(我可以看到它在任务栏上闪烁),但无法恢复。

我能绕过这一点的唯一方法是使用注释代码:最小化当前活动的窗口,然后恢复我想看到的窗口。

感谢所有的帮助,谢谢

全局热键,工作版本:

    private void Form1_Load(object sender, EventArgs e)
    {
        string atomName = Thread.CurrentThread.ManagedThreadId.ToString("X8") + this.GetType().FullName;
        short HotkeyID = GlobalAddAtom(atomName);
        if (!RegisterHotKey(this.Handle, HotkeyID, (uint)GlobalHotkeys.MOD_CONTROL, (uint)Keys.D5))
            listBox.Items.Add("failed: " + "unable to register hotkey. Error: " + Marshal.GetLastWin32Error().ToString());
        else
            listBox.Items.Add("succeeded adding hotkey id"+(uint)Keys.D5);
    }
    protected override void WndProc(ref Message m)
    {
        const int WM_HOTKEY = 0x0312;
        if (m.Msg == WM_HOTKEY)
        {
            if ((short)m.WParam==HotkeyID)
                listBox.Items.Add("Hotkey."+ (short)m.WParam);
        }
        base.WndProc(ref m);
    }

C#全局密钥和SetForegroundWindow

您的问题是没有注册全局热键,而是使用了键盘挂钩。键盘挂钩并不是用来作为全局热键的。

请改用RegisterHotKey函数
检查此示例:http://www.pinvoke.net/default.aspx/user32.registerhotkey

您的直接问题是,应用程序无法随时将自己置于前台。因为这对用户来说很烦人。它只能在特定事件期间执行此操作。类似于应用程序启动或处理真正的全局热键。

系统限制哪些进程可以设置前台窗口。只有当以下条件之一为真时,进程才能设置前景窗口:

  • 该过程是前台过程
  • 该进程由前台进程启动
  • 进程接收到最后一个输入事件
  • 没有前台进程
  • 前台进程正在调试中
  • 前景未锁定(请参见LockSetForegroundWindow)
  • 前台锁定超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)
  • 没有激活的菜单

尝试使用另一个SW_常量,如SW_SHOW。SW_RESTORE仅适用于使用SW_MINIMIZE 最小化的窗口

相关文章:
  • 没有找到相关文章