Мне нужно перечислить все открытые окна и получить их заголовок, но проблема в том, что некоторые окна принадлежат одному и тому же процессу, но другому потоку, который заблокирован (ожидание мьютекса).Поэтому я не могу использовать 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);
, но я всегда получаю 0, что означает, что функция не выполнена, а sb всегда равен нулю.Есть идеи?Большое спасибо.