簡體   English   中英

C# 全局熱鍵在首先最小化到托盤時不起作用,但在顯示並再次最小化后它起作用

[英]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 步按照他們的方式工作; 我認為他們都不應該退出該程序。 這是否可靠地發生? 也許更聰明的人可以冒險猜測它為什么起作用。 手柄是否有可能被回收?

我進一步調查了這個問題(遇到了同樣的問題),發現在您將應用程序發送到托盤后窗口句柄立即被銷毀,然后當我被發送到托盤時立即重新創建窗口句柄:

  1. OnHandleDestroyed(EventArgs e)調用
  2. 之后調用OnHandleCreated(EventArgs e)

只需在 OnHandleCreated 回調中重新注冊您的熱鍵,然后每當您將應用程序發送到托盤時,您的熱鍵就會起作用。

PS:當您最小化到任務欄時,您的熱鍵將始終有效。

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM