2

对不起,如果我像傻瓜一样错过任何事情,但我必须发送这个项目,我有一个问题

我已经在创建的句柄上注册了全局热键(编辑!!)

    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);
    }
4

2 回答 2

2

很确定您的问题与ShowInTaskbar属性的不断切换有关。据我所知,这样做会破坏并重新创建您的窗口,这意味着您注册热键的句柄现在指向错误的东西。

就您现在的代码而言,仅在首次创建表单时才分配热键,因为调用Hide()不会处理窗口(为了记录,Visible调用是多余的; Show()/Hide() 相当于切换Visible到真假)。

据我所知,有两种方法可以解决这个问题。在属性上切换后分配您的热键ShowInTaskbar,或者覆盖OnHandleCreated表单的方法并在那里进行分配。

我不知道为什么您的第 3 步和第 4 步会以它们的方式工作;我认为他们都不应该退出程序。这是否可靠地发生?也许更聪明的人可以冒险猜测它为什么起作用。手柄是否有可能被回收?

于 2014-03-10T13:51:23.170 回答
0

我进一步调查了这个问题(遇到了同样的问题),发现窗口句柄在您将应用程序发送到托盘后立即被破坏,然后当我被发送到托盘时立即重新创建窗口句柄:

  1. OnHandleDestroyed(EventArgs e)被调用
  2. OnHandleCreated(EventArgs e)紧接着被调用

只需在 OnHandleCreated 回调中重新注册您的热键,然后每当您将应用程序发送到托盘时,您的热键就会起作用。

PS:当您最小化到任务栏时,您的热键将始终有效。

问候

于 2020-04-17T22:58:33.240 回答