我为我的应用程序创建了一些全局热键,我希望它们仅在我的应用程序处于活动状态时才能工作。 (如果我的申请不是活动表格,它应该不起作用。)
那么如何检查我的C#
winform应用程序是否是所有其他Windows应用程序中的活动表单?
我试过
if(this.Focused)
//Do somthing
但它不能正常工作
答案 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;
}
答案 1 :(得分:0)
您可以使用Windows API函数GetForegroundWindow
和GetWindowText
。
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();
}
}