A customer reported that sometimes the
GetGUIThreadInfo
function returned a valid window handle,
but sometimes it returned all NULL
s.
DWORD dwThreadId = GetWindowThreadProcessId(hwnd, NULL); GUITHREADINFO guiThreadInfo; guiThreadInfo.cbSize = sizeof(GUITHREADINFO); if (GetGUIThreadInfo(dwThreadId, &guiThreadInfo)) { HWND hwndActive = guiThreadInfo.hwndActive; ... }
Most of the time, the call to
GetGUIThreadInfo
succeeds and obtains
hwndActive
successfully.
But sometimes,
GetGUIThreadInfo
succeeds,
but
guiThreadInfo.
is NULL
.
In fact,
aside from the cbSize
,
all the
members of the
guiThreadInfo
are NULL
or zero.
"Under what circumstances will
GetGUIThreadInfo
succeed but return no data?"
I suggested that they start with the obvious: Is it possible that the function is correct and the thread has no active window?
The customer confessed that they were too quick to
assume that there was a problem with the
GetGUIThreadInfo
function
just because it reported no data.
It turns out that, in fact,
there was no data to report.
The root cause was that another thread in their
program called
SetWindowPos
and didn't
pass the
SWP_
flag.
As a result, that thread stole activation from
the first thread,
so when they got around to asking the first thread,
"Tell me about your active window, your focus window,
your caret window, and your caret location,"
it replied,
"I don't have any of those things!"