0

我最终试图编写一些东西来检查特定窗口是否存在,并将其设置为活动状态。我能够使用 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 命令同时让它们使用正则表达式进行检查呢?

更新~~~~我选择了一个最佳答案,但这里是我如何让它工作的实际代码,以防万一有人感兴趣。

   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 方法中进行测试以引发警报,但我稍后会担心。

4

3 回答 3

3

我想EnumWindows()这就是你要找的东西,虽然我不是 100% 确定你会如何在 C# 中使用它,因为你需要一个回调。

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

于 2012-12-26T22:17:05.817 回答
3

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

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

GetProcessesByName 上的 MSDN

于 2012-12-26T22:19:36.453 回答
1

我认为没有用于搜索具有正则表达式模式的窗口的内置函数/方法/API。完成它的一种方法是枚举窗口,例如这个例子,然后使用正则表达式比较回调函数中的窗口文本。

于 2012-12-26T22:18:42.903 回答