name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1194442938015&lmt=1194190197&format=336x280_as&output=html&correlator=1194442937843&url=file%3A%2F%2F%2FC%3A%2FDocuments%2520and%2520Settings%2Flhh1%2F%E6%A1%8C%E9%9D%A2%2FCLanguage.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=583001034.1194442938&ga_sid=1194442938&ga_hid=1942779085&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency"> #include <genstub.cpp>
// Hot key values.
#define RESUME_KEY 101
#define SUSPEND_KEY 102
#define TERMINATE_KEY 103
DWORD WINAPI ThreadProc(HWND hWnd)
{
TCHAR szBuffer[128];
wsprintf( szBuffer, "Starting Thread ID = %lX", GetCurrentThreadId() );
SetWindowText( hWnd, szBuffer );
Sleep( 5000 );
wsprintf( szBuffer, "Thread %lX finished execution", GetCurrentThreadId() );
SetWindowText( hWnd, szBuffer );
ExitThread( TRUE );
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HANDLE hChild = 0;
switch (uMsg)
{
case WM_CREATE:
RegisterHotKey(hWnd, RESUME_KEY, MOD_ALT, 'R');
RegisterHotKey(hWnd, SUSPEND_KEY, MOD_ALT, 'S');
RegisterHotKey(hWnd, TERMINATE_KEY, MOD_ALT, 'K');
return DefWindowProc( hWnd, uMsg, wParam, lParam );
case WM_DESTROY:
UnregisterHotKey(hWnd, RESUME_KEY);
UnregisterHotKey(hWnd, SUSPEND_KEY);
UnregisterHotKey(hWnd, TERMINATE_KEY);
PostQuitMessage( 0 );
break;
case WM_HOTKEY:
{
TCHAR szBuffer[128];
DWORD dwExitCodeThread = STILL_ACTIVE;
lstrcpy( szBuffer, "No Child Thread Running" );
if (hChild)
GetExitCodeThread(hChild, &dwExitCodeThread);
if (dwExitCodeThread==STILL_ACTIVE)
switch (wParam)
{
case SUSPEND_KEY:
wsprintf( szBuffer, "Suspending thread %lX", hChild );
SuspendThread(hChild);
break;
case RESUME_KEY:
wsprintf( szBuffer, "Resuming thread %lX", hChild );
ResumeThread(hChild);
break;
case TERMINATE_KEY:
wsprintf( szBuffer, "Terminating thread %lX", hChild );
TerminateThread(hChild, FALSE);
break;
}
SetWindowText( hWnd, szBuffer );
}
break;
case WM_COMMAND: // Process menu items.
switch ( LOWORD( wParam ) )
{
case IDM_TEST:
{ // Start a thread. Only one thread at at time.
DWORD dwExitCodeThread;
DWORD dwChild;
if (hChild)
GetExitCodeThread( hChild, &dwExitCodeThread );
if (dwExitCodeThread!=STILL_ACTIVE)
hChild = CreateThread(NULL, 0, ThreadProc, hWnd, 0, &dwChild );
}
break;
case IDM_EXIT:
DestroyWindow( hWnd );
break;
}
break;
default:
return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
return NULL;
}