首页 > 解决方案 > 如果窗口在后台,如何允许按钮单击事件

问题描述

我有一个应用程序ParentApp,它启动另一个应用程序,ChildApp

ParentApp在运行时显示一个表单ChildApp- 只是一种当前正在运行的 Childapp显示带有一个取消按钮,它会杀死ChildApp.

我想ParentApp在运行时不可用ChildApp,所以每当有人点击ParentApp我想把它带到ChildApp前台,这很好。

因此,我已将此事件处理程序添加到ParentApp响应Activated表单事件的事件处理程序中。

private void ParentAppForm_Activated(object sender, EventArgs e)
{
    IntPtr childHwnd = _childApp.MainWindowHandle;
    SetForegroundWindow(childHwnd );
}

GotFocus似乎没有工作)

不幸的是,如果用户单击 上的按钮,则永远不会点击该Cancel按钮ParentAppForm的事件处理程序,因为该Activated事件首先触发并将前台窗口设置为另一个进程。

是否存在 - 即使应用程序不在前台也允许按钮事件触发?

标签: c#winformseventsprocess

解决方案


作为一种快速的解决方法,您可以检查鼠标指针是否在Button.Bounds表单激活时描述的区域内。

Form.Bounds您可以使用带有 Cursor.Position 坐标的PointToClient鼠标指针位置转换为坐标。

像这样的东西:

private void ParentAppForm_Activated(object sender, EventArgs e)
{
    if (this.button1.Bounds.Contains(this.PointToClient(Cursor.Position)))
        ChildForm.Close();  //Or ChildApp.Kill()
    else
        ChildForm.BringToFront();  //Or SetForegroundWindow(ChildApp.Handle)
}

推荐阅读