我最终试图写一些可以检查特定窗口是否存在的东西,并在事件时将其设置为活动。我能够使用Findwindow查找字面的Windows名称。
int hWnd = FindWindow(null, "121226-000377 - company - Oracle RightNow CX Cloud Service");
if (hWnd > 0) //If found
{
SetForegroundWindow(hWnd); //Activate it
}
else
{
MessageBox.Show("Window Not Found!");
}
标题前面的数字更改,并且永远不会相同,因此我试图使用正则表达式来查找是否有任何活动窗口具有如上图所示的名称结构,但数字可以更改。我有一个定期的表达,但我不知道如何实施它。我尝试了:
int hWnd = FindWindow(null, @"^d+-d+s.*?RightNow CX");
if (hWnd > 0) //If found
{
SetForegroundWindow(hWnd); //Activate it
}
else
{
MessageBox.Show("Window Not Found!");
}
,但它不断失败。那么,如何使用Findwindow/setForegroundWindow命令在使它们使用正则表达式时检查?
更新~~~~我选择了一个最佳答案,但这是我如何使此工作的实际代码,以防万一有人感兴趣。
protected static bool EnumTheWindows(IntPtr hWnd, IntPtr lParam)
{
int size = GetWindowTextLength(hWnd);
if (size++ > 0 && IsWindowVisible(hWnd))
{
StringBuilder sb = new StringBuilder(size);
GetWindowText(hWnd, sb, size);
Match match = Regex.Match(sb.ToString(), @"^d+-d+s.*?RightNow CX",
RegexOptions.IgnoreCase);
// Here we check the Match instance.
if (match.Success)
{
ActivateRNT(sb.ToString());
}
else
{
//this gets triggered for every single failure
}
//do nothing
}
return true;
}
private static void ActivateRNT(string rnt)
{
//Find the window, using the CORRECT Window Title, for example, Notepad
int hWnd = FindWindow(null, rnt);
if (hWnd > 0) //If found
{
SetForegroundWindow(hWnd); //Activate it
}
else
{
MessageBox.Show("Window Not Found!");
}
}
我仍然需要弄清楚如何在Enumwindows方法中测试如何在不存在窗口的情况下发布警报,但是我会在以后担心。
我猜EnumWindows()
是您想要的,尽管我不确定您在C#中如何使用它,因为您需要一个回调。
编辑:pinvoke.net获得了一些代码,包括示例回调。编辑2:链接的[MSDN示例] [3]有更多有关为什么/如何这样做的详细信息。
如果您知道搜索窗口的过程名称,则可以尝试这样的东西:
Process[] processes = Process.GetProcessesByName("notepad");
foreach (Process p in processes)
{
IntPtr pFoundWindow = p.MainWindowHandle;
SetForegroundWindow(pFoundWindow);
}
getProcessesbyname上的msdn
我认为没有内置功能/方法/API用于搜索具有正则表达式模式的窗口。完成它的一种方法是列举窗口,例如使用此示例,然后使用正则表达式在回调函数中比较窗口文本。