1

我正在使用 VC++ CLR 窗口窗体创建一个 GUI,并希望创建一个热键来从我最小化的系统托盘中恢复我的窗口。我发现这RegisterHotKey是在系统中创建全局热键的一种方法,但我不明白如何在我的代码中使用它。

有什么想法吗??

4

2 回答 2

3

首先,您需要#include Windows 头文件,将其放在 stdafx.h 预编译头文件中,例如:

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
#pragma once

#include <Windows.h>
#pragma comment(lib, "user32.lib")

#pragma 确保链接器将链接 user32.dll 的导入库,这是链接 RegisterHotKey() 所必需的。

接下来,在 Form 类中,您需要重写 OnHandleCreated() 方法。每当创建窗体的本机窗口时,它就会运行,这种情况可能会发生不止一次。让它看起来像这样:

protected:
    virtual void OnHandleCreated(EventArgs^ e) override {
        __super::OnHandleCreated(e);
        RegisterHotKey((HWND)this->Handle.ToPointer(), 1, 
            MOD_ALT | MOD_CONTROL, (UINT)Keys::F1); 
    }

我将热键硬编码为 Ctrl+Alt+F1,将其更改为您要使用的热键。您可以添加其他热键,更改id参数(第二个参数,我使用 1)。

然后你需要检测当用户按键时windows会发送给你的WM_HOTKEY消息。这需要覆盖表单的 WndProc() 方法,如下所示:

protected:
    virtual void WndProc(Message% m) override {
        if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == 1) {
            this->WindowState = FormWindowState::Normal;
            this->BringToFront();
        }
        __super::WndProc(m);
    }

通过最小化表单进行测试,按下 Ctrl+Alt+F1,您将看到窗口恢复并移回前台。

于 2013-10-19T14:58:44.297 回答
0

感谢您的帮助汉斯,我尝试了代码,但它并没有像我想要的那样工作。我的程序将使用以下代码最小化到系统托盘中

private:
    System::Void MyForm::MyForm_Resize(System::Object^  sender, System::EventArgs^  e)  {
        if (WindowState == FormWindowState::Minimized)
        {
            Hide();
        }
    }

如果我在最小化时注释掉它隐藏的部分,但效果很好。

于 2013-10-21T00:21:23.517 回答