[英]C# Global hotkeys won't work in first minimize to tray but after showing and minimize again it works
對不起,如果我像傻瓜一樣錯過了什么,但我必須發送這個項目,我有一個問題
我已經在創建的句柄上注冊了全局熱鍵(編輯!!)
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
RegisterHotKey(this.Handle, 1, 0x0000,0x70);
RegisterHotKey(this.Handle, 2, 0x0000,0x71);
RegisterHotKey(this.Handle, 3, 0x0000,0x72);
RegisterHotKey(this.Handle, 4, 0x0000,0x73);
RegisterHotKey(this.Handle, 5, 0x0000,0x74);
RegisterHotKey(this.Handle, 6, 0x0000,0x75);
RegisterHotKey(this.Handle, 7, 0x0000,0x76);
RegisterHotKey(this.Handle, 8, 0x0000,0x77);
RegisterHotKey(this.Handle, 9, 0x0000,0x78);
RegisterHotKey(this.Handle, 10, 0x0000,0x79);
RegisterHotKey(this.Handle, 11, 0x0000,0x7A);
RegisterHotKey(this.Handle, 12, 0x0000,0x7B);
RegisterHotKey(this.Handle, 13, 0x0002,0x45);
}
我的 button1 確實隱藏了表單並使托盤圖標可見
void Button1Click(object sender, EventArgs e)
{
trayicon.Visible=true;
ShowInTaskbar=false;
this.Hide();
trayicon.ShowBalloonTip(2000,"Corrector is now minimized","Right click at check symbol to Exit or show and change hotkey",ToolTipIcon.Info);
}
我也有雙擊托盤圖標后顯示表單的功能
private void trayicon_DoubleClick(object Sender, EventArgs e)
{
this.Show();
Visible=true;
ShowInTaskbar=true;
}
現在問題來了,我設置全局熱鍵13退出程序。
1.我打開程序,按Ctrl+E(熱鍵)>>>它確實退出了程序
2.我打開程序按按鈕1然后Ctrl+E>>>它不退出程序
3.我打開程序,按下按鈕1並雙擊圖標,表格顯示然后Ctrl+E>>>>它確實退出了程序
4.我打開程序,按下按鈕1並雙擊圖標,表格顯示然后再次按下按鈕1表格消失然后Ctrl + E>>>它確實退出了程序。
這就是為什么我很困惑,2 和 4 應該有相同的結果,但是在 4 上它確實有效,而在 2 上它不起作用
有人請幫助我
謝謝
龐
編輯:!!
我的 Wndproc
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312)
{
int id = m.WParam.ToInt32();
if(id==14)
{
Application.Exit();
}
if(id==13)
{
Application.Exit();
}
if(check2==0)
{
this.TopMost=true;
MessageBox.Show("กรุณาเลือกปุ่มที่จะใช้เเก้ก่อน,Select hotkey first","ข้อผิดพลาด",MessageBoxButtons.OK,MessageBoxIcon.Error);
this.TopMost=false;
}
if(id==check2)
{
translate();//You can replace this statement with your desired response to the Hotkey.
}
}
base.WndProc(ref m);
}
很確定您的問題與ShowInTaskbar
屬性的不斷切換有關。 據我所知,這樣做會破壞並重新創建您的窗口,這意味着您注冊熱鍵的句柄現在指向錯誤的內容。
就您現在的代碼而言,只有在首次創建表單時才會分配熱鍵,因為調用Hide()
不會處理窗口(記錄, Visible
調用是多余的;Show()/Hide() 是相當於將Visible
切換為真/假)。
據我所知,有兩種方法可以解決這個問題。 在ShowInTaskbar
屬性上切換后分配熱鍵,或者覆蓋表單的OnHandleCreated
方法並在那里進行分配。
我不知道為什么你的第 3 步和第 4 步按照他們的方式工作; 我認為他們都不應該退出該程序。 這是否可靠地發生? 也許更聰明的人可以冒險猜測它為什么起作用。 手柄是否有可能被回收?
我進一步調查了這個問題(遇到了同樣的問題),發現在您將應用程序發送到托盤后窗口句柄立即被銷毀,然后當我被發送到托盤時立即重新創建窗口句柄:
OnHandleDestroyed(EventArgs e)
調用OnHandleCreated(EventArgs e)
只需在 OnHandleCreated 回調中重新注冊您的熱鍵,然后每當您將應用程序發送到托盤時,您的熱鍵就會起作用。
PS:當您最小化到任務欄時,您的熱鍵將始終有效。
問候
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.