GetWindowText vs Process.MainWindowTitle

时间:2018-05-08 23:40:42

标签: c# windows winapi

我尝试使用.Net / C#获取当前活动应用程序(或窗口)的进程信息。

目前我正在使用

[DllImport("user32")]
private static extern UInt32 GetWindowThreadProcessId(IntPtr hWnd, out Int32 lpdwProcessId);

获取当前活动窗口。 我知道除了使用这个API函数之外,没有其他方法可以做到这一点。

由此,我使用:

[DllImport("user32.dll")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

要获取属于该窗口的进程名称,然后我会获得进一步的进程信息。

我也用

"Toad for Oracle - myConnection - Somequery.sql".

获取当前的窗口文本或标题。

现在,使用Process类,我可以使用     MainWindowTitle 获得主窗口标题。

问题是,MainWindowTitle和GetWindowText不会返回相同的信息。

例如,让我们说打开的主要应用程序是" Toad"连接和编辑器打开。 然后用GetWindowText我得到:

"myConnection".

和Process.MainWindowTitle返回

(use-package :cl-ppcre)
(setf (fdefinition 're-split) #'split)  ;; create an alias
(unintern 'split)
(use-package :series)

所以,问题是如何获得与使用GetWindowText完全相同的文本,但只使用.Net类?

编辑: 我发现其实的原因仅仅是因为两个函数都没有查询同一个窗口句柄。 在GetForegroundWindow中返回的窗口句柄是编号198982。 而MainWindowHandle属性,我认为是MainWindowTitle属性中使用的属性是198954。 使用Spy ++我可以找到并确认那些窗口处理标题是由相应函数返回的标题。

所以"问题",如果有的话,Process类没有正确地将最前景窗口识别为主窗口。

1 个答案:

答案 0 :(得分:0)

GetForegroundWindow为您提供用户正在使用的活动窗口,该窗口可能是拥有的窗口或模式对话框,不一定是应用程序主/根窗口。

MainWindow是一个.NET概念,本机win32没有这样的东西,应用程序中可以有0个,1个或多个“主窗口”。

某些Delphi / C ++ Builder应用程序具有任务栏按钮的HWND,每个表单都是属于此“不可见”窗口的拥有窗口。其他UI框架可能会引发类似的特技,这可能会混淆“主窗口”检测。

如果您不想使用p-invoke,可以使用UI Automation检查其他应用程序。从前景窗口开始,沿着自有窗口和子窗口向上走......