Code archives/User Libs/CloseHandler
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Utility_InstallCloseHandler( hwnd ) Where: Whenever you want to catch the WM_CLOSE message of a window. With: Window handle of the window you want it to hook into. Utility_UninstallCloseHandler( hwnd ) What: Whenever you want to stop catching the WM_CLOSE message of a window. With: Window handle of the window you want it to stop hooking into. Utility_GetCloseCount%( hwnd ) What: Returns the amount of WM_CLOSE message catched for hwnd. With: Window handle of the window you want to get the amount of WM_CLOSE from. | |||||
;---------------------------------------------------------------- ;-- Userlib ;---------------------------------------------------------------- ;.lib "User32.dll" ;User32_SetWindowLong%(hwnd%, nIndex%, dwNewLong%):"SetWindowLongA" ;User32_GetWindowLong%(hwnd%, index%):"GetWindowLongA" ; ;.lib "Utility_CloseHandler.dll" ;Utility_InstallCloseHandler(hwnd%):"Utility_InstallCloseHandler" ;Utility_UninstallCloseHandler(hwnd%):"Utility_UninstallCloseHandler" ;Utility_GetCloseCount%(hwnd%):"Utility_GetCloseCount" ;---------------------------------------------------------------- ;---------------------------------------------------------------- ;-- C++ DLL ;---------------------------------------------------------------- ; #Include <windows.h> ; ; LRESULT CALLBACK _CloseWindowProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); ; ; struct WindowUserData { ; Int oldWindowProcedure; ; Int oldUserData; ; Int closeCount; ; }; ; ; STDAPIV_(void) Utility_InstallCloseHandler(HWND hwnd) { ; If (hwnd) { ; WindowUserData* hwndData = New WindowUserData; ; ZeroMemory(hwndData, sizeof(hwndData)); ; hwndData->oldWindowProcedure = SetWindowLong(hwnd, GWL_WNDPROC, (LONG)&_CloseWindowProcedure); ; hwndData->oldUserData = SetWindowLong(hwnd, GWL_USERDATA, (LONG)hwndData); ; } ; } ; ; STDAPIV_(void) Utility_UninstallCloseHandler(HWND hwnd) { ; If (hwnd) { ; WindowUserData* hwndData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA); ; If (hwndData) { ; SetWindowLong(hwnd, GWL_USERDATA, hwndData->oldUserData); ; SetWindowLong(hwnd, GWL_WNDPROC, hwndData->oldWindowProcedure); ; Delete hwndData; ; } ; } ; } ; ; STDAPIV_(Int) Utility_GetCloseCount(HWND hwnd) { ; If (hwnd) { ; WindowUserData* hwndData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA); ; If (hwndData) { ; Int toReturn = hwndData->closeCount; ; hwndData->closeCount = 0; ; Return toReturn; ; } ; } ; Return 0; ; } ; ; LRESULT CALLBACK _CloseWindowProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { ; WindowUserData* hwndData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA); ; If (hwndData) { ; switch(uMsg) { ; Case WM_CLOSE: ; Case WM_DESTROY: ; hwndData->closeCount++; ; Return False; ; Default: ; Return CallWindowProc((WNDPROC)hwndData->oldWindowProcedure, hwnd, uMsg, wParam, lParam); ; } ; } Else { ; Return DefWindowProc(hwnd, uMsg, wParam, lParam); ; } ; } ; ; BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {return TRUE;} ;---------------------------------------------------------------- ; Linker Options: -static-libgcc -static-libstdc++ ; Linker Libraries: user32 ;---------------------------------------------------------------- SetBuffer BackBuffer() Utility_InstallCloseHandler(SystemProperty("AppHWND")) Local c While Not KeyHit(1) c = c + Utility_GetCloseCount(SystemProperty("AppHWND")) Cls Text MouseX(),MouseY(),c Flip Wend Utility_UninstallCloseHandler(SystemProperty("AppHWND")) |
Comments
| ||
Uh.. I don't have a C compiler |
| ||
You want a more simple approach? Just use WinBlitz3D V.1.1 :) |
Code Archives Forum