我需要枚举所有打开的窗口并获取它们的标题,但问题是某些窗口属于同一个进程但是属于另一个被阻塞的线程(等待互斥锁).因此,我不能将GetWindowText用于属于我自己进程的窗口,因为这将导致SendMessage调用,这将阻止我的代码执行(因为它将等待被阻塞线程的relpy).
顺便说一下这是一篇关于GetWindowText内部如何工作的有趣文章: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);
Run Code Online (Sandbox Code Playgroud)
但我总是得到0表示函数失败,而sb总是为空.有任何想法吗?非常感谢.
@Alex给了你正确的答案.但是因为我已经输入了代码,所以这里是你可以使用的P/Invoke声明.
[DllImport("User32.dll", SetLastError=true)]
public static extern int SendMessageTimeout(
IntPtr hWnd,
uint uMsg,
uint wParam,
StringBuilder lParam,
uint fuFlags,
uint uTimeout,
IntPtr lpdwResult);
Run Code Online (Sandbox Code Playgroud)
将您的StringBuilder传递给lParam,因为WM_GETTEXT填充了lParam指定的缓冲区,您只需将IntPtr.Zero传递给teh lpdwResult即可.