我正在使用 VC++ CLR 窗口窗体创建一个 GUI,并希望创建一个热键来从我最小化的系统托盘中恢复我的窗口。我发现这RegisterHotKey
是在系统中创建全局热键的一种方法,但我不明白如何在我的代码中使用它。
有什么想法吗??
我正在使用 VC++ CLR 窗口窗体创建一个 GUI,并希望创建一个热键来从我最小化的系统托盘中恢复我的窗口。我发现这RegisterHotKey
是在系统中创建全局热键的一种方法,但我不明白如何在我的代码中使用它。
有什么想法吗??
首先,您需要#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,您将看到窗口恢复并移回前台。
感谢您的帮助汉斯,我尝试了代码,但它并没有像我想要的那样工作。我的程序将使用以下代码最小化到系统托盘中
private:
System::Void MyForm::MyForm_Resize(System::Object^ sender, System::EventArgs^ e) {
if (WindowState == FormWindowState::Minimized)
{
Hide();
}
}
如果我在最小化时注释掉它隐藏的部分,但效果很好。