需要一种方法来确定应用程序的主要形式是从任务栏上的其他窗口的顶部
我的应用程序,当不聚焦或最小化或其他窗口后面需要显示通知窗口,以引起注意。并且需要在用户预先提交应用程序时关闭通知窗口。需要一种方法来确定应用程序的主要形式是从任务栏上的其他窗口的顶部
我能够确定的主要形式(即我的应用程序)是否处于活动
FormWindowState.Minimized和this.Handle的组合!=则activeWindow
现在,如果用户用应用程序,我必须删除通知窗口。
为了确定我在应用程序的主窗体和Form_Activated内部使用Form_Activated,我试图找到主窗体的主窗体是活动的。
我尝试了以下方法,但并未在用户可以预先使用该应用程序的所有方案中工作。
订阅的Form.ActiveForm和在侧确定它是主要的形式 - Form.ActiveForm是MainForm的
-
当用户最小化的应用和它restors - 工作正常
2.当用户使用Alt + Tab将应用程序预先带入时 - 可以正常工作
3.当用户指定KS从任务栏中的应用程序图标了 - 不工作
使用的IntPtr GetForegroundWindow()
当用户最小化应用和restors它 - 工作正常
-
当用户使用Alt + Tab来提前提交该应用程序 - 由于未检索到句柄而不起作用
3.当用户从任务栏点击应用程序图标了 - 不工作当手柄没有检索
使用this.Focused - 在上述情况下,假
使用IntPtr GetTopWindow(IntPtr hwnd) like GetTopWindow((sender as MainForm).Handle).ToString() != "0
”。这是正确的,即使是显示的通知窗口这是不是我想要的。
如果我只是认购Form_Activated,显示在通知窗口时,那么也mainForm_Activated被激发。因此,我需要在这里做一些额外的检查,所有的方法我试过以上,没有变成成功的用户可以把应用前景的所有方式。
任何帮助将不胜感激。
的问题是,当点击隐藏应用程序的任务栏按钮重复点击将触发启动事件,当点击显示application.So onResize受到()也保持不会触发事件。
protected override void OnActivated(EventArgs e)
{
IntPtr activeWindow = Engine.GetForegroundWindow();
if ((this).Handle == activeWindow)
{
MainFormActive?.Invoke(this, EventArgs.Empty);
}
}
调整大小
protected override void OnResize (EventArgs e)
{
if (previousState == FormWindowState.Minimized && this.WindowState == FormWindowState.Normal)
// raise OnActivated
}
另外我看到下面的实用 - 处理WM_NCACTIVATE中的WndProc
if (m.Msg == Engine.WM_NCACTIVATE)
{
if ((this).Handle == Engine.GetForegroundWindow())
{
// Do what ever
}
}
WM_NCACTIVATE = 0x0086
没有检查没有应用程序最小化/恢复类型事件 - 或者只是delphi – BugFinder
我没有检查任何应用程序最小化事件。 – soms
我试图登录痕迹当控制在Form_Activated event.And我做了以下内容:点击几次在bar.If应用任务的应用程序图标是不是在其他窗口的顶部,然后点击这会带来将应用程序放在前面。再次单击将隐藏应用程序。令人惊讶的在窗口前看到,该form_activated是打不和,当应用程序是不可见的(任务栏上的图标,接下来点击)触发的事件Form_Activated,我可以看到日志。 – soms