mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
2.7 KiB
130 lines
2.7 KiB
///////////////////////////////////////////////////////////
|
|
//
|
|
//
|
|
// lockout.cpp - Implementation file for CLockOut
|
|
//
|
|
//
|
|
#include "header.h"
|
|
|
|
// Our header file
|
|
#include "lockout.h"
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Construction
|
|
//
|
|
CLockOut::CLockOut()
|
|
:m_bLocked(false)
|
|
{
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Destructor
|
|
//
|
|
CLockOut::~CLockOut()
|
|
{
|
|
Unlock() ;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Main function.
|
|
//
|
|
void
|
|
CLockOut::LockOut(HWND hwndOwner)
|
|
{
|
|
if (!m_bLocked)
|
|
{
|
|
// Determine if we are parented by the desktop?
|
|
|
|
// Initialize our varaibles.
|
|
m_CountDisabled = 0 ;
|
|
GetWindowThreadProcessId(hwndOwner, &m_ProcessId) ;
|
|
|
|
// Enumerate the windows
|
|
BOOL b = EnumWindows(s_EnumWindowProc, reinterpret_cast<LPARAM>(this)) ;
|
|
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Main function.
|
|
//
|
|
void
|
|
CLockOut::Unlock()
|
|
{
|
|
|
|
if (m_bLocked)
|
|
{
|
|
// We only set m_bLocked if m_CountDisabled is incremented.
|
|
ASSERT(m_CountDisabled > 0) ;
|
|
|
|
for (int i = 0 ; i < m_CountDisabled ; i++)
|
|
{
|
|
if (::IsValidWindow(m_HwndDisabled[i]))
|
|
{
|
|
EnableWindow(m_HwndDisabled[i], TRUE);
|
|
}
|
|
}
|
|
|
|
m_bLocked = false ;
|
|
m_CountDisabled = 0 ;
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Callbacks
|
|
//
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// EnumWindowProc
|
|
//
|
|
BOOL
|
|
CLockOut::EnumWindowProc(HWND hwnd)
|
|
{
|
|
ASSERT(IsValidWindow(hwnd)) ;// Window should be guarenting this.
|
|
|
|
// Only need to disable if window is enabled.
|
|
if (IsWindowEnabled(hwnd))
|
|
{
|
|
// Make sure window is in the same process.
|
|
DWORD procid = NULL;
|
|
GetWindowThreadProcessId(hwnd, &procid) ;
|
|
if (procid == m_ProcessId)
|
|
{
|
|
//Disable the window.
|
|
ASSERT(m_CountDisabled < c_MaxWindows) ; //TODO Make the array grow
|
|
if (m_CountDisabled >= c_MaxWindows)
|
|
{
|
|
// Don't crash, just quit.
|
|
return FALSE ;
|
|
}
|
|
|
|
// Add the window to the array.
|
|
m_HwndDisabled[m_CountDisabled++] = hwnd ;
|
|
|
|
// Disable the window
|
|
EnableWindow(hwnd, FALSE) ;
|
|
|
|
m_bLocked = TRUE ;
|
|
}
|
|
}
|
|
|
|
return TRUE ;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Static callback
|
|
//
|
|
BOOL CALLBACK
|
|
CLockOut::s_EnumWindowProc(HWND hwnd, LPARAM lparam)
|
|
{
|
|
CLockOut* p = reinterpret_cast<CLockOut*>(lparam) ;
|
|
return p->EnumWindowProc(hwnd) ;
|
|
}
|
|
|