我尝试使用.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类没有正确地将最前景窗口识别为主窗口。
答案 0 :(得分:0)
GetForegroundWindow
为您提供用户正在使用的活动窗口,该窗口可能是拥有的窗口或模式对话框,不一定是应用程序主/根窗口。
MainWindow是一个.NET概念,本机win32没有这样的东西,应用程序中可以有0个,1个或多个“主窗口”。
某些Delphi / C ++ Builder应用程序具有任务栏按钮的HWND,每个表单都是属于此“不可见”窗口的拥有窗口。其他UI框架可能会引发类似的特技,这可能会混淆“主窗口”检测。
如果您不想使用p-invoke,可以使用UI Automation检查其他应用程序。从前景窗口开始,沿着自有窗口和子窗口向上走......