gpt4 book ai didi

c# - 窗口在服务模式下没有文本

转载 作者:行者123 更新时间:2023-11-30 18:34:27 25 4
gpt4 key购买 nike

我正在研究批处理引擎,因为我们有一个第三方软件,它是一个需要在批处理中运行的客户端软件

我正在使用这段代码来枚举进程 ID

public IEnumerable<int> EnumerateProcessWindowHandles(int processId)
{
var handles = new List<IntPtr>();
try
{
foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
Win32.EnumThreadWindows(thread.Id,
(hWnd, lParam) =>
{
handles.Add(hWnd);
return true;
}, IntPtr.Zero);

}
catch (Exception e) {}
return handles.Select(h => (int)h);
}

然后这段代码获取每个窗口的文本

public string GetText(int hWnd)
{
// Allocate correct string length first
int length = Win32.GetWindowTextLength(hWnd);
var sb = new StringBuilder(length + 1);
Win32.GetWindowText(hWnd, sb, sb.Capacity);
return sb.ToString();
}

从服务执行程序时,我正在寻找的窗口从未找到,如果我从控制台程序启动它,它就可以工作。如果我尝试从服务中启动 calc.exe,我会得到计算器窗口,因此可以从服务中获取窗口。从我的服务中收听 calc.exe 时的输出

2013-04-16 13:52:09; Verbose; 23000; 1728; 5592; Batch: Window hwnd: 8454324; Title: Calculator

2013-04-16 13:52:09; Verbose; 23000; 1728; 5592; Batch: Window hwnd: 393910; Title:

2013-04-16 13:52:09; Verbose; 23000; 1728; 5592; Batch: Window hwnd: 328806; Title: GDI+ Window

2013-04-16 13:52:09; Information; 23000; 1728; 5592; Batch: Calculator shown

并在监听我的真实应用时输出

2013-04-16 14:25:16; Verbose; 23000; 5076; 5140; Batch: Window hwnd: 524976; Title: .NET-BroadcastEventWindow.2.0.0.0.218f99c.0

2013-04-16 14:25:16; Verbose; 23000; 5076; 5140; Batch: Window hwnd: 524978; Title: GDI+ Window

2013-04-16 14:25:16; Verbose; 23000; 5076; 5140; Batch: Window hwnd: 590366; Title:

2013-04-16 14:25:16; Verbose; 23000; 5076; 5140; Batch: Window hwnd: 787088; Title:

2013-04-16 14:25:16; Verbose; 23000; 5076; 5140; Batch: Window hwnd: 656044; Title:

2013-04-16 14:25:16; Verbose; 23000; 5076; 5140; Batch: Window hwnd: 721578; Title:

2013-04-16 14:25:16; Verbose; 23000; 5076; 5140; Batch: Window hwnd: 590926; Title:

如您所见,大多数 hwnd 都是无标题的,如果我这样做但从控制台模式我得到

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 66672; Title: MSCTFIME UI

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 328694; Title:

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 328754; Title:

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 197656; Title:

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 132122; Title:

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 132178; Title: .NET-BroadcastEventWindow.2.0.0.0.218f99c.0

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 132100; Title: MSCTFIME UI

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 132186; Title: Default IME

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 132176; Title: GDI+ Window

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 197654; Title: Default IME

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 132144; Title:

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 132142; Title:

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 132140; Title: Default IME

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 459078; Title: Task Progress

2013-04-16 14:21:08; Verbose; 23000; 4864; 4120; Console: Window hwnd: 132078; Title: Default IME

我得到更多的hwnds和更多的标题,我感兴趣的窗口是Task Progress

这可以解决吗?我正在起诉 Process.Start 以启动流程

最佳答案

我假设您使用的是 Vista 或更高版本,因为此问题不会发生在早期版本上。正如@Damien_The_Unbeliever 所说,这是一个 session 0 isolation问题。

Is this solvable? I'm suing Process.Start to start the process

在 session 0 中启动第三方应用程序(您无法控制其代码)通常不是一个好主意。

  • 您不知道该应用程序是否设计为在 session 0 的限制下运行。
  • 安全问题,因为您可以在此 session 中对系统造成更大的破坏。

使用CreateProcessAsUser注意将 STARTUPINFO 的 lpDesktop 成员设置为“Winsta0\\default”& 通过 CreateEnvironmentBlock 获得的环境 block .关于如何从 C# 中调用它们,请参阅此 post

您可以通过WTSQueryUserToken 获取用户 token session ID 可通过 WTSEnumerateSessions 提供给服务或 SERVICE_CONTROL_SESSIONCHANGE 消息。

As you can see most hwnds are titleless,

您无法检索窗口文本的原因是因为 Windows 通过发送 WM_GETTEXT 消息执行此操作(请参阅 msdn 上的备注部分),当然它不能这样做,因为您的引擎在服务桌面上.

您可以通过在调用了 SetThreadDesktop 的单独线程中执行操作来在服务中解决此问题与用户的桌面(小心,请参阅备注中的警告)。

关于c# - 窗口在服务模式下没有文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16037206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com