#include #include #include "usermsg.h" // #define SEND_TEST_MESSAGES 1 #define RETURN_SUCCESS 0 #define RETURN_FAILURE 1 #define RETURN_HANG 2 /******************************************************************************* * * G L O B A L D A T A * *******************************************************************************/ HINSTANCE g_hInstance; // Global instance handle of this DLL. HWND g_hwndParent; // Parent of the battery meter. LPTSTR szDebugPBT[] = { TEXT("WM_POWERBROADCAST, PBT_APMQUERYSUSPEND"), TEXT("WM_POWERBROADCAST, PBT_APMQUERYSTANDBY"), TEXT("WM_POWERBROADCAST, PBT_APMQUERYSUSPENDFAILED"), TEXT("WM_POWERBROADCAST, PBT_APMQUERYSTANDBYFAILED"), TEXT("WM_POWERBROADCAST, PBT_APMSUSPEND"), TEXT("WM_POWERBROADCAST, PBT_APMSTANDBY"), TEXT("WM_POWERBROADCAST, PBT_APMRESUMECRITICAL"), TEXT("WM_POWERBROADCAST, PBT_APMRESUMESUSPEND"), TEXT("WM_POWERBROADCAST, PBT_APMRESUMESTANDBY"), TEXT("WM_POWERBROADCAST, PBT_APMBATTERYLOW"), TEXT("WM_POWERBROADCAST, PBT_APMPOWERSTATUSCHANGE"), TEXT("WM_POWERBROADCAST, PBT_APMOEMEVENT"), TEXT("WM_POWERBROADCAST, unknown"), TEXT("WM_POWERBROADCAST, unknown"), TEXT("WM_POWERBROADCAST, unknown"), TEXT("WM_POWERBROADCAST, unknown"), TEXT("WM_POWERBROADCAST, unknown"), TEXT("WM_POWERBROADCAST, unknown"), TEXT("WM_POWERBROADCAST, PBT_APMRESUMEAUTOMATIC") }; #ifdef SEND_TEST_MESSAGES HANDLE g_hNotifyMsg; #define STACKSIZE 4096 /******************************************************************************* * * NotifyMsgThread * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ DWORD NotifyMsgThread(DWORD dwParameter) { static INT wParam; SetThreadPriority(g_hNotifyMsg, THREAD_PRIORITY_LOWEST); SendMessage(g_hwndParent, WM_POWERBROADCAST, PBT_APMPOWERSTATUSCHANGE, 0); for (; ;) { Sleep(3000); SendMessage(g_hwndParent, WM_POWERBROADCAST, wParam, 0); if (++wParam > 0xC) { wParam = 0; } } return 0; } #endif /******************************************************************************* * * DlgProc * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ BOOL CALLBACK DlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static UINT uiReturnAction; UINT uiCount; switch (uMsg) { case WM_INITDIALOG: g_hwndParent = hWnd; CheckDlgButton(hWnd, IDC_PASSPWRMSG, BST_CHECKED); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_PASSPWRMSG: uiReturnAction = RETURN_SUCCESS; break; case IDC_FAILPWRMSG: uiReturnAction = RETURN_FAILURE; break; case IDC_HANGPWRMSG: uiReturnAction = RETURN_HANG; break; case IDCANCEL: case IDOK: EndDialog(hWnd, wParam); break; } break; case WM_POWERBROADCAST: if (//(wParam >= PBT_APMQUERYSUSPEND) && // compiler warning (wParam <= PBT_APMRESUMEAUTOMATIC)) { SendDlgItemMessage(hWnd, IDC_STATUSLIST, LB_ADDSTRING, 0, (LPARAM) szDebugPBT[wParam]); } else { SendDlgItemMessage(hWnd, IDC_STATUSLIST, LB_ADDSTRING, 0, (LPARAM) TEXT("WM_POWERBROADCAST, unknown wParam")); } uiCount = SendDlgItemMessage(hWnd, IDC_STATUSLIST, LB_GETCOUNT, 0, 0); if ((uiCount != LB_ERR) && (uiCount)) { SendDlgItemMessage(hWnd, IDC_STATUSLIST, LB_SETCURSEL, uiCount-1, 0); } switch (uiReturnAction) { case RETURN_HANG: while (uiReturnAction == RETURN_HANG); case RETURN_SUCCESS: SetWindowLong(hWnd, DWL_MSGRESULT, TRUE); return TRUE; case RETURN_FAILURE: SetWindowLong(hWnd, DWL_MSGRESULT, FALSE); return TRUE; } break; case WM_DEVICECHANGE: SendDlgItemMessage(hWnd, IDC_STATUSLIST, LB_ADDSTRING, 0, (LPARAM) TEXT("WM_DEVICECHANGE")); break; } return FALSE; } /******************************************************************************* * * WinMain * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpAnsiCmdLine, INT cmdShow) { DWORD dwThreadId; #ifdef SEND_TEST_MESSAGES // Spin a thread to send update messages g_hNotifyMsg = CreateThread(NULL, STACKSIZE, (LPTHREAD_START_ROUTINE) NotifyMsgThread, NULL, 0, &dwThreadId); #endif DialogBox(hInstance, MAKEINTRESOURCE(IDD_STATUSDLG), NULL, DlgProc); return 0; }