windows-nt/Source/XPSP1/NT/printscan/wia/test/wiastress/pushdlgbutton.h
2020-09-26 16:20:57 +08:00

128 lines
2.5 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
PushDlgButton.h
Abstract:
Author:
Hakki T. Bostanci (hakkib) 06-Apr-2000
Revision History:
--*/
#ifndef _PUSHDLGBUTTON_H_
#define _PUSHDLGBUTTON_H_
//////////////////////////////////////////////////////////////////////////
//
//
//
class CPushDlgButton
{
public:
CPushDlgButton(
DWORD dwWatchThread,
PCTSTR pszTitle,
int nButtonId
) :
m_dwWatchThread(dwWatchThread),
m_pszTitle(pszTitle),
m_nButtonId(nButtonId),
m_StopEvent(TRUE, FALSE),
m_Thread(ThreadProc, this),
m_nMatchingWindows(0),
m_nMatchingButtons(0),
m_nListItems(0)
{
}
~CPushDlgButton()
{
m_StopEvent.Set();
m_Thread.WaitForSingleObject();
}
private:
static DWORD WINAPI ThreadProc(PVOID pParameter)
{
CPushDlgButton *that = (CPushDlgButton *) pParameter;
try
{
while (that->m_StopEvent.WaitForSingleObject(1000) == WAIT_TIMEOUT)
{
EnumThreadWindows(that->m_dwWatchThread, EnumThreadWndProc, (LPARAM) that);
}
}
catch (const CError &)
{
}
return TRUE;
}
static BOOL CALLBACK EnumThreadWndProc(HWND hWnd, LPARAM lParam)
{
CPushDlgButton *that = (CPushDlgButton *) lParam;
if (_tcscmp(CSafeWindowText(hWnd), that->m_pszTitle) == 0)
{
++that->m_nMatchingWindows;
EnumChildWindows(hWnd, EnumChildProc, lParam);
if (that->m_nMatchingButtons)
{
PostMessage(hWnd, WM_COMMAND, that->m_nButtonId, 0);
}
while (IsWindow(hWnd))
{
Sleep(100);
}
}
return TRUE;
}
static BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam)
{
CPushDlgButton *that = (CPushDlgButton *) lParam;
if (GetDlgCtrlID(hWnd) == that->m_nButtonId)
{
++that->m_nMatchingButtons;
}
else if (_tcscmp(CClassName(hWnd), _T("SysListView32")) == 0)
{
that->m_nListItems = ListView_GetItemCount(hWnd);
}
return TRUE;
}
public:
int m_nMatchingWindows;
int m_nMatchingButtons;
int m_nListItems;
private:
DWORD m_dwWatchThread;
PCTSTR m_pszTitle;
int m_nButtonId;
Event m_StopEvent;
CThread m_Thread;
};
#endif //_PUSHDLGBUTTON_H_