如何使用FindWindow使用正则表达式?

时间:2012-12-26 22:11:13

标签: c# regex winforms setfocus findwindow

我最终会尝试编写一些能够检查特定窗口是否存在的内容,并在事件发生时将其设置为活动窗口。 我能够使用FindWindow来查找文字窗口名称。

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命令同时使用正则表达式来检查?

UPDATE ~~~~ 我选择了一个最佳答案,但这里是我如何使用它的实际代码,以防任何人感兴趣。

   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方法中测试以发出警报,但我会在以后担心这一点。

3 个答案:

答案 0 :(得分:3)

我猜EnumWindows()正是您正在寻找的,虽然我不是100%确定您在C#中如何使用它,因为您需要回调。

编辑:pinvoke.net获得了一些代码,包括示例回调。 编辑2:链接的[MSDN示例] [3]有更多详细信息,说明为什么/如何这样做。

答案 1 :(得分:2)

如果您知道搜索到的窗口的进程名称,可以尝试使用以下内容:

Process[] processes = Process.GetProcessesByName("notepad");
foreach (Process p in processes)
{
    IntPtr pFoundWindow = p.MainWindowHandle;
    SetForegroundWindow(pFoundWindow);
}

MSDN on GetProcessesByName

答案 2 :(得分:1)

我不认为有一个内置的函数/方法/ API用于搜索具有正则表达式模式的窗口。实现它的一种方法是枚举窗口such as with this example,然后使用正则表达式比较回调函数中的窗口文本。