我正在尝试从系统托盘应用程序中打开一个始终在顶部的表单,主要是为了显示一些即时通知。
为了实现始终处于领先地位的行为,我遵循了参考文献1和参考文献2中的说明。
引用中的代码只有在我在Frm_Load上添加以下代码时才能工作。
private void Frm_Load(object sender, EventArgs e) {
this.TopMost = true;
this.Activate();
this.Focus();
this.BringToFront();
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); // code from references
}
代码仅在Visual Studio 2019中运行时有效。在exe窗体不作为顶部打开,也不总是停留在顶部,它停留在其他窗口下。我在构建设置中禁用了visual studio代码优化,但它没有帮助。
是什么导致代码在IDE和exe中工作不同?我如何解决这个问题,并显示像Winamp这样的顶部窗口?
问题源于我在线程中打开表单的不当使用。我注意到我开始从一个侦听器线程打开表单(侦听来自websocket的通知)。不知何故,visual studio做到了这一点,并按照我的期望始终在顶部打开表单。
当我将窗体的打开代码从线程更改为主窗体(带方法调用器)时,问题得到解决,exe也与调试相同。侦听器线程中的代码如下所示:
GuiManager.getInstance().getMainForm().Invoke((MethodInvoker)delegate () {
PopupUtil.showPopup();
});
我希望它会对在调试环境中遇到类似问题的人有所帮助。并释放了exe.