我需要枚举所有打开的窗口并获取它们的标题,但问题是某些窗口属于同一进程但属于不同的线程,该线程被阻塞(等待互斥体)。因此,我不能对属于我自己的进程的窗口使用 GetWindowText,因为这将导致 SendMessage 调用,这将阻止我的代码执行(因为它将等待被阻止线程的 relpy)。
顺便说一句,这里有一篇关于 GetWindowText 内部如何工作的有趣文章:http://blogs.msdn.com/b/oldnewthing/archive/2003/08/21/54675.aspx http://blogs.msdn.com/b/oldnewthing/archive/2003/08/21/54675.aspx
作为解决方案,决定对窗口使用 SendMessageTimeout 来检索其标题,但我无法使其工作。我正在做的是:
[DllImport("User32.dll")]
public static extern int SendMessageTimeout(
IntPtr hWnd,
int uMsg,
int wParam,
int lParam,
int fuFlags,
int uTimeout,
out StringBuilder lpdwResult);
...
StringBuilder sb = new StringBuilder(256);
int result = Win32API.SendMessageTimeout(
hWnd,
0x0D /*WM_GETTEXT*/,
256,
0,
10 /*SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG*/,
500,
out sb);
但我总是得到 0 意味着函数失败,并且 sb 始终为空。
有任何想法吗?
多谢。