Disabling All Top Level Thread Windows
Posted
by Douglas Peterson
on April 24th, 1999
class DisableTaskWindows
{
public:
DisableTaskWindows()
{ ::EnumWindows(EnumWindowsProc, FALSE); }
~DisableTaskWindows()
{ ::EnumWindows(EnumWindowsProc, TRUE); }
private:
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
};
BOOL CALLBACK DisableTaskWindows::EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
if (::GetWindowThreadProcessId(hwnd, NULL) == ::GetCurrentThreadId())
::EnableWindow(hwnd, lParam);
return TRUE;
}
It becomes a little more complicated if you need to specify the thread ID:
class DisableTaskWindows
{
public:
DisableTaskWindows(DWORD dwThreadID);
~DisableTaskWindows();
private:
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
BOOL m_bEnable;
DWORD m_dwThreadID;
};
BOOL CALLBACK DisableTaskWindows::EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
if (::GetWindowThreadProcessId(hwnd, NULL) == ((DisableTaskWindows*)lParam)->m_dwThreadID)
::EnableWindow(hwnd, ((DisableTaskWindows*)lParam)->m_bEnable);
return TRUE;
}
DisableTaskWindows::DisableTaskWindows(DWORD dwThreadID)
: m_dwThreadID(dwThreadID)
{
m_bEnable = FALSE;
::EnumWindows(EnumWindowsProc, (LPARAM)this);
}
DisableTaskWindows::~DisableTaskWindows()
{
m_bEnable = TRUE;
::EnumWindows(EnumWindowsProc, (LPARAM)this);
}
It's very simple to use:
CMyDialog dlg;
{
DisableTaskWindows dtw;
- or -
DisableTaskWindows dtw(AfxGetThread()->m_nThreadID);
dlg.DoModal();
} // Destroys dtw which re-enables the windows
You could also create a class derived from CDialog, override DoModal and add a DisableTaskWindows object before calling the base class. This would make it even more seemless:
class CDisablingDialog : public CDialog
{
public:
CDisablingDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL)
: CDialog(lpszTemplateName, pParentWnd) {}
CDisablingDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL)
: CDialog(nIDTemplate, pParentWnd) {}
virtual int DoModal()
{
DisableTaskWindows dtw;
return CDialog::DoModal();
}
};
There are lot's of combinations you could come up with, but I'll leave that as an excercise for the reader.
Date Last Updated: April 24, 1999

Comments
Hmm
Posted by Legacy on 10/18/2001 12:00amOriginally posted by: Hmm
Well, I was searching for some etxra info on the procedure DisableTaskWindows from Borland's VCL. You might wnna credit them/it...
ReplyThanks
Posted by Legacy on 04/28/1999 12:00amOriginally posted by: Randy Pitz
I've been looking for this type of functionality for a long time. Thanks!
Reply