首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#全局键和SetForegroundWindow

C#全局键和SetForegroundWindow
EN

Stack Overflow用户
提问于 2011-06-11 04:25:49
回答 2查看 1.4K关注 0票数 4

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

这是我用来把一个窗口放在前面的代码,它只有在被一个Button事件触发时才有效:

代码语言:javascript
复制
    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+preview/globalKeyboardHook.cs?spec=svn3&r=3

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

代码语言:javascript
复制
    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());

    }

这不会做任何事情。我的窗口在后台被激活(我可以看到它在任务栏中闪烁),但没有恢复。

解决这个问题的唯一方法是使用注释代码:最小化当前活动的窗口,然后恢复我想要看到的窗口。

非常感谢您的帮助,谢谢。

全局热键,工作版本:

代码语言:javascript
复制
    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);
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-11 04:53:42

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

请改用RegisterHotKey函数。

检查此示例:http://www.pinvoke.net/default.aspx/user32.registerhotkey

您当前面临的问题是,应用程序不能随时将自己放到前台。因为这对用户来说很烦人。它只能在特定事件期间执行此操作。例如应用程序启动或处理真正的全局热键。

系统限制哪些进程可以设置前台窗口。仅当满足以下条件之一时,进程才能设置前台窗口:

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

Stack Overflow用户

发布于 2011-06-11 04:51:13

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6311707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档