//TH-Header //***************************************************************************************** // Copyright (c) 2018 Your Company Name // All rights reserved. // // $FileName : MessageQueueHelpers.pkg // $ProjectName : The Hammer 3 // $Authors : // $Created : 02.08.2018 11:54 // // Contents: // Used for dispatching keys from the message queue. // //***************************************************************************************** //TH-RevisionStart // ******************** // MODIFICATION SUMMARY // ******************** // ####### DD/MM/YYYY WHO COMMENT //TH-RevisionEnd Define WM_HOTKEY For |CI$0312 // 0x0312 Define PM_REMOVE For 1 // dll-function and msg-type needed for removing posted messages from the message queue // 28.1.2003 BP Struct tMSG Handle hwnd //as Handle Integer message //as Integer #IFDEF IS$WIN64 Integer tMSGMissingAlignment #ENDIF Longptr wParam //as WPARAM Longptr lParam //as LPARAM DWord Time //as DWord DWord ptX //as DWord DWord ptY //as DWord DWORD lPrivate End_Struct External_Function TranslateMessage "TranslateMessage" user32.dll Pointer pMsg Returns Integer #IF (!@ < 200) External_Function PeekMessage "PeekMessageA" user32.dll Pointer pMsg Handle hWnd Integer iMin Integer iMax Integer iRemove Returns Integer External_Function DispatchMessage "DispatchMessageA" user32.dll Pointer pMsg Returns Integer #ELSE External_Function PeekMessage "PeekMessageW" user32.dll Pointer pMsg Handle hWnd Integer iMin Integer iMax Integer iRemove Returns Integer External_Function DispatchMessage "DispatchMessageW" user32.dll Pointer pMsg Returns Integer #ENDIF // // Dispatches the next message in the queue if it is a hotkey // (a key that combined with the alt-keyboard key) // Procedure DispatchHotkey Integer iPendingMessage Integer iVoid iTranslated tMSG WinMsg Move 0 To WinMsg.ptX If (PeekMessage(AddressOf(WinMsg), 0, 0, 0, PM_REMOVE)) Begin Move WinMsg.message To iPendingMessage If (iPendingMessage = WM_HOTKEY) Begin Move (TranslateMessage(AddressOf(WinMsg))) To iTranslated If (iTranslated) Begin Move (DispatchMessage(AddressOf(WinMsg))) To iVoid End End End End_Procedure // // Dispatches ANY key press from the loop, not just one, but all of them // Procedure DispatchAnyKey Integer iPendingMessage Integer iVoid iTranslated tMSG WinMsg Move 0 To WinMsg.ptX If (PeekMessage(AddressOf(WinMsg), 0, 0, 0, PM_REMOVE)) Begin Move WinMsg.message To iPendingMessage If (iPendingMessage = WM_HOTKEY or iPendingMessage = WM_KEYDOWN or iPendingMessage = WM_KEYUP) Begin Move (TranslateMessage(AddressOf(WinMsg))) To iTranslated If (iTranslated) Begin Move (DispatchMessage(AddressOf(WinMsg))) To iVoid End End End End_Procedure