如何检查我的应用程序是否为Windows激活表单

时间:2015-06-17 05:21:45

标签: c# windows winforms

我为我的应用程序创建了一些全局热键,我希望它们仅在我的应用程序处于活动状态时才能工作。 (如果我的申请不是活动表格,它应该不起作用。)

那么如何检查我的C# winform应用程序是否是所有其他Windows应用程序中的活动表单?

我试过

if(this.Focused)
  //Do somthing

但它不能正常工作

2 个答案:

答案 0 :(得分:0)

试试这个:

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);

public static bool Activates()
{
    var x = GetForegroundWindow();
    if (x == IntPtr.Zero) {
        return false;      
    }

    var y = Process.GetCurrentProcess().Id;
    int i;
    GetWindowThreadProcessId(x, out i);

    return i == y;
}

您还可以参考:C#: Detecting which application has focus

答案 1 :(得分:0)

您可以使用Windows API函数GetForegroundWindowGetWindowText

GetForegroundWindow

GetForegroundWindow函数返回用户当前正在使用的窗口的句柄。

<强> GetWindowText函数

GetWindowText函数将指定窗口标题栏的文本(如果有的话)复制到缓冲区中。

添加以下代码以声明API函数:

[ DllImport("user32.dll") ]
        static extern int GetForegroundWindow();

[ DllImport("user32.dll") ]
        static extern int GetWindowText(int hWnd, StringBuilder text, int count);

启动计时器:

private void timer1_Tick(object sender, System.EventArgs e)
        {
            GetActiveWindow();
        }

活动窗口功能:

private void GetActiveWindow()
    {

        const int nChars = 256;
        int handle = 0;
        StringBuilder Buff = new StringBuilder(nChars);

        handle = GetForegroundWindow();

        if ( GetWindowText(handle, Buff, nChars) > 0 )
        {
            this.captionWindowLabel.Text = Buff.ToString();
            this.IDWindowLabel.Text = handle.ToString();
        }

    }