VC++ CLR ウィンドウ フォームを使用して GUI を作成しており、最小化したシステム トレイからウィンドウを復元するためのホットキーを作成したいと考えていました。システムでグローバル ホットキーを作成する方法であることがわかりましたRegisterHotKey
が、コード内でそれを使用する方法がわかりません。
何かご意見は??
VC++ CLR ウィンドウ フォームを使用して GUI を作成しており、最小化したシステム トレイからウィンドウを復元するためのホットキーを作成したいと考えていました。システムでグローバル ホットキーを作成する方法であることがわかりましたRegisterHotKey
が、コード内でそれを使用する方法がわかりません。
何かご意見は??
まず、Windows ヘッダーを #include する必要があります。たとえば、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 は、リンカーが、RegisterHotKey() をリンクするために必要な user32.dll のインポート ライブラリをリンクすることを保証します。
次に、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引数を変更したりできます (2 番目の引数、私は 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();
}
}
最小化すると隠れる部分をコメントアウトするとうまくいきました。