Private Type POINTAPI
x As Long y As Long End Type Private Type MSGTYPE hWnd As Long message As Long wParam As Long lParam As Long time As Long pt As POINTAPI End Type Private Declare Function GetInputState Lib "user32" () As Long Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg _ As MSGTYPE, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, _ ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long Const WM_KEYFIRST = &H100 Const WM_KEYLAST = &H108 Const PM_REMOVE = &H1 ' Returns the code of the last key that has been pressed, zero otherwise ' Check whether the user pressed the escape key, and optionally displays a ' message ' box that asks him or her to confirm that the job should be canceled ' ' example: ' Do ' ' do your processing here ' If EscapePressed("Do you want to stop processing?") Then Exit Do ' Loop Public Function EscapePressed(Optional msgText As String) As Boolean Dim mess As MSGTYPE If GetInputState() Then PeekMessage mess, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE If mess.wParam = vbKeyEscape Then If Len(msgText) = 0 Then ' Escape was pressed, return True without showing a msgbox EscapePressed = True Else ' Escape was pressed, ask user to confirm EscapePressed = (MsgBox(msgText, vbQuestion + vbYesNo) = vbYes) End If End If End If End Function |