在if语句中使用GetForegroundWindow结果来检查用户的当前窗口
我需要检查用户当前选择的窗口,如果选择了特定程序,则执行操作。
我以前没有使用过GetForegroundWindow函数,也找不到有关如何以这种方式使用它的任何信息。
我只需要比较当前窗口,看看它是否是一个特定的程序。 但是,GetForegroundWindow函数似乎不会返回字符串或int。 所以主要是我不知道如何找出我要比较的程序窗口的值。
我目前有代码来获取当前窗口:
[DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); IntPtr selectedWindow = GetForegroundWindow();
我需要能够如下理想地应用它:
If (selectedWindow!="SpecificProgram") { }
我希望GetForegroundWindow值/对象对每个程序都是唯一的,并且不会以某种方式运行,每个特定的程序/窗口每次都有不同的值。
我也将此作为Windows窗体的一部分,但我怀疑它很重要。
-谢谢你的帮助
编辑:这种方式有效,并使用当前窗口的图块,这使得它非常适合检查窗口是否正确:
[DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll")] static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); private string GetActiveWindowTitle() { const int nChars = 256; StringBuilder Buff = new StringBuilder(nChars); IntPtr handle = GetForegroundWindow(); if (GetWindowText(handle, Buff, nChars) > 0) { return Buff.ToString(); } return null; }
然后我可以这样做:
if (GetActiveWindowTitle()=="Name of Window") { DoStuff.jpg }
它有一些代码,但它的工作原理:
#region Retrieve list of windows [DllImport("user32")] private static extern int GetWindowLongA(IntPtr hWnd, int index); [DllImport("USER32.DLL")] private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); [DllImport("USER32.DLL")] private static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam); [DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); private const int GWL_STYLE = -16; private const ulong WS_VISIBLE = 0x10000000L; private const ulong WS_BORDER = 0x00800000L; private const ulong TARGETWINDOW = WS_BORDER | WS_VISIBLE; internal class Window { public string Title; public IntPtr Handle; public override string ToString() { return Title; } } private List windows; private void GetWindows() { windows = new List (); EnumWindows(Callback, 0); } private bool Callback(IntPtr hwnd, int lParam) { if (this.Handle != hwnd && (GetWindowLongA(hwnd, GWL_STYLE) & TARGETWINDOW) == TARGETWINDOW) { StringBuilder sb = new StringBuilder(100); GetWindowText(hwnd, sb, sb.Capacity); Window t = new Window(); t.Handle = hwnd; t.Title = sb.ToString(); windows.Add(t); } return true; //continue enumeration } #endregion
并检查用户窗口:
IntPtr selectedWindow = GetForegroundWindow(); GetWindows(); for (i = 0; i < windows.Count; i++) { if(selectedWindow == windows[i].Handle && windows[i].Title == "Program Title X") { //Do stuff break; } }
瓦尔特