C#全局热键在第一次最小化到托盘时不起作用,但在显示并再次最小化后它起作用

     2023-03-17     275

关键词:

【中文标题】C#全局热键在第一次最小化到托盘时不起作用,但在显示并再次最小化后它起作用【英文标题】:C# Global hotkeys won't work in first minimize to tray but after showing and minimize again it works 【发布时间】:2014-04-13 08:48:54 【问题描述】:

对不起,如果我错过了像傻瓜一样的东西,但我必须发送这个项目并且我有一个问题

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

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

【问题讨论】:

可能是this ? @Sinatr 我不这么认为,如果因为那件事,为什么我的第二次尝试有效而第一次无效 不知道,也许其他的东西得到了关注?试试看吧。 【参考方案1】:

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

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

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

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

【讨论】:

我宁愿创建一个单独的窗口来注册这些热键。 当然可以这样做;不过,对他来说最简单的解决方法是重写 OnHandleCreated 方法并为每个 ShowInTaskbar 切换重新分配,IMO。 mediafire.com/?7xrcc0d0iby9rk1 rar 包含我的程序按第一个按钮然后你在我的问题表单中 你有没有尝试过我的任何建议?不要个人认为,但我不会执行你的流氓可执行文件。您的问题已被理解;如果您有更多要分享的代码或行为问题,请用它更新您的问题。 @glace 我已经覆盖了我的 onhandlecreated 方法要更新帖子【参考方案2】:

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

    OnHandleDestroyed(EventArgs e) 调用 OnHandleCreated(EventArgs e) 之后立即调用

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

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

问候

【讨论】:

React setState 在第一次尝试时不起作用,但在第二次尝试时起作用?

】ReactsetState在第一次尝试时不起作用,但在第二次尝试时起作用?【英文标题】:ReactsetStatenotworkingonfirsttry,butworksonsecond?【发布时间】:2016-10-1706:04:11【问题描述】:我在单击按钮时调用了handleSelection方法,但是,如果我单击... 查看详情

UIButton 在第一次运行时工作正常,但在模拟器上第二次运行时不起作用

】UIButton在第一次运行时工作正常,但在模拟器上第二次运行时不起作用【英文标题】:TheUIButtonworksfineatfirstrun,butdoesn\'tworkatthesecondrunonthesimulator【发布时间】:2019-10-0812:34:43【问题描述】:我一直在尝试制作这个基本的应用程... 查看详情

在 C# 中使用全局热键粘贴当前时间

】在C#中使用全局热键粘贴当前时间【英文标题】:PastecurrenttimeusingglobalhotkeyinC#【发布时间】:2014-08-2707:49:19【问题描述】:我正在尝试使用C#在任何窗口中粘贴当前时间。所以我在C#中定义了一个全局热键,当我在任何窗口中... 查看详情

Contact Form 7 在第一次提交时不起作用,但在第二次按下 sumbit 按钮时它工作正常

】ContactForm7在第一次提交时不起作用,但在第二次按下sumbit按钮时它工作正常【英文标题】:ContactForm7isnotworkingwhensubmittingforthefirsttimebutitworksfinewhensecondtimesumbitbuttonispressed【发布时间】:2019-09-1503:19:49【问题描述】:联系表格7-W... 查看详情

进程启动但在使用 CreateProcessLogonW 或类似方法启动时不起作用

】进程启动但在使用CreateProcessLogonW或类似方法启动时不起作用【英文标题】:ProcessesStartbutdonotfunctionwhenlaunchedwithCreateProcessLogonWorsimilarmethods【发布时间】:2011-12-0221:24:54【问题描述】:我开始使用C#以编程方式运行我的应用程序... 查看详情

AWS S3 上传图像在部署到 EBS 时不起作用,但在 localhost SpringBoot (JAVA) 中起作用

】AWSS3上传图像在部署到EBS时不起作用,但在localhostSpringBoot(JAVA)中起作用【英文标题】:AWSS3uploadingImagesdoesnotworkwhendeployedtoEBSbutworksinlocalhostSpringBoot(JAVA)【发布时间】:2019-01-1020:51:25【问题描述】:我可以将图像从本地上传到S3... 查看详情

界面最小化时热键不起作用

】界面最小化时热键不起作用【英文标题】:Hotkeydoesn\'tworkwhileinterfaceisminimized【发布时间】:2021-01-3017:59:25【问题描述】:我使用计时器和几个按钮在VisualBasic中创建了一个简单的自动点击器。我为我的开始和停止按钮分配了键... 查看详情

反应本机代码内联​​工作,但在导入时不起作用

】反应本机代码内联​​工作,但在导入时不起作用【英文标题】:reactnativecodeworksinlinebutnotwhenimported【发布时间】:2020-04-1002:29:32【问题描述】:以下代码在reactnative0.61.5中正常工作。//userApplication/screens/UserScreen.jsimportReact,Compo... 查看详情

LayoutAnimationController 在隐藏视图组时不起作用,但在显示视图组时起作用

】LayoutAnimationController在隐藏视图组时不起作用,但在显示视图组时起作用【英文标题】:LayoutAnimationControllernotworkingwhenhidingViewGroupbutworkswhenShowingviewgroup【发布时间】:2016-02-1012:35:48【问题描述】:LayoutAnimationController用于为视图... 查看详情

为啥应用于 bootstrap.css 的更改在发布时不起作用,但在 localhost 上起作用?

】为啥应用于bootstrap.css的更改在发布时不起作用,但在localhost上起作用?【英文标题】:Whydochangesappliedtobootstrap.cssnotworkwhenpublishedbutdoworkonlocalhost?为什么应用于bootstrap.css的更改在发布时不起作用,但在localhost上起作用?【发布... 查看详情

用户区域设置在第一次请求时不起作用

】用户区域设置在第一次请求时不起作用【英文标题】:Userlocaledoesnotworkatfirstrequest【发布时间】:2013-09-0923:54:00【问题描述】:我的网站正在运行Symfony,主版本。到目前为止,我可以使用网站上的LocalListenerlogic,由于代码与我... 查看详情

React Router 在重新加载时起作用,但在单击链接时不起作用

】ReactRouter在重新加载时起作用,但在单击链接时不起作用【英文标题】:ReactRouterworkonreload,butnotwhenclickingonalink【发布时间】:2017-11-0511:37:24【问题描述】:我已经使用react-router版本4设置了React。当我直接在浏览器上输入URL时,... 查看详情

WPF中的全局热键?

...何位置执行我的应用程序中的方法,即使我的应用程序已最小化或在托盘中运行。例如,使用ctrl+alt+t执行方法。这在WPF中是否可行,如果可以,如何实现?【问题讨论】:【参考方案1】:您需要查看user32.dll中 查看详情

UIButtons 在向右旋转时起作用,但在向左旋转时不起作用。嗯?

】UIButtons在向右旋转时起作用,但在向左旋转时不起作用。嗯?【英文标题】:UIButtonsworkwhenrotatedright,butnotwhenrotatedleft.Huh?【发布时间】:2010-06-1720:26:59【问题描述】:当设备旋转到LandscapeLeft或LandscapeRight方向时,我有一个添加... 查看详情

jquery datatables 按钮:['excel'] 在 document.ready() 中构建表格时不起作用,但在动态构建表格时起作用

】jquerydatatables按钮:[\\\'excel\\\']在document.ready()中构建表格时不起作用,但在动态构建表格时起作用【英文标题】:jquerydatatablesbuttons:[\'excel\']doesnotworkwhentableisbuiltindocument.ready()butdoeswhenthetableisbuiltdynamicallyjquerydatatables按钮:[\ 查看详情

require_once 在文件相对于根目录时不起作用,但在相对于当前位置时起作用

】require_once在文件相对于根目录时不起作用,但在相对于当前位置时起作用【英文标题】:require_oncedoesn\'tworkwhenthefileisrelativetotheroot,butworkswhenrelativetothecurrentlocation【发布时间】:2018-09-2813:54:32【问题描述】:这有效:require_once\... 查看详情

c#最小化到托盘+双击托盘恢复+禁止运行多个该程序(代码片段)

托盘程序的制作:1.添加notifyIcon控件,并添加Icon,否则托盘没有图标(托盘右键菜单也可直接在属性里添加);2.响应Form的Resize或SizeChanged消息://HidetosystemtrayprivatevoidForm1_Resize(objectsender,EventArgse)if(this.WindowState==FormWindowState.Minimi 查看详情

useEffect 中的套接字连接事件在创建组件时不起作用,但在 React 中刷新页面后起作用

】useEffect中的套接字连接事件在创建组件时不起作用,但在React中刷新页面后起作用【英文标题】:socketconnecteventinsideuseEffectdoesnotworkwhencomponentiscreatedbutworksafterrefreshingthepageinReact【发布时间】:2022-01-0514:37:38【问题描述】:我想... 查看详情