Author | Aart Onkenhout |
Date | 04-11-2000 |
A frequently asked question is: how can I captrue the F10 key or capture clicking on the X-button. Those things can be done by adding a user-event to your Window and map it to pbm_syscommand. A WM_SYSCOMMAND message is sent to your WIndow whenever the user chooses a command from the window menu (or systemmenu) or when the user chooses the maximize button, minimize button, restore button or close button.
You can check for these messages in your user-event or sent them yourself by sending a WM_SYSCOMMAND (= 274) message to your WIndow. This would look like:
Send( Handle( yourWindow ), WM_SYSCOMMAND, SC_CLOSE, 0 )
The values for the different messages are as follows:
Message | Value | LPARAM | Description |
WM_SYSCOMMAND | 274 | ||
SC_SIZE | 61440 | Sizes the Window. | |
SC_MOVE | 61456 | Moves the Window. | |
SC_MINIMIZE | 61472 | User clicked the Minimize-button | |
SC_MAXIMIZE | 61488 | User clicked the Maximize-button | |
SC_CLOSE | 61536 | User clicked the Close-button | |
SC_KEYMENU | 61696 | Contains the character code of the key that is used with the Alt key. When pressing F10 or just Alt this value is 0. | User pressed F10, Alt or another menu-shortkey. |
SC_RESTORE | 61728 | User clicked the Restore-button | |
SC_TASKLIST | 61744 | Activates the Start menu. | |
SC_SCREENSAVE | 61760 | Executes the screensaver application specified in the [boot] section of the system.ini file. | |
SC_MONITORPOWER | 61808 |
1 = the display is going to low power 2 = the display is being shut off |
Sets the state of the display. |
A point of attention here: the four low-order bits of the wparam value (which gives you your commandtype value) are used internally by the system and make the value of wparam vary between the values mentioned above plus 15 (so, SC_SIZE has values within the range from 61440 uptil and including 61455). To obtain the correct result when testing the value of wparam you have to combine the wparam value with the value 0xFFF0 (65520). You can do this by using the bitwise AND operator (see the of_BitwiseAnd function within the PFC object pfc_n_cst_numerical how to do this).
By using the SC_MOVE message you can move a Window without a Titlebar. Add one line of code to the mousedown-event:
Send( Handle( yourWindow ), WM_SYSCOMMAND, SC_MOVE + 2, 0 )
You have to add two to fake that your mouse is on the TitleBar.
When you want to capture the F10 systemkey, you can code something like this:
Declare an instance variable:
Boolean ib_AltPressed
In the systemkey-event of your Window (this is a predefined Window-event) add:
If key = KeyAlt! Then
ib_AltPressed = True
Else
ib_AltPressed = False
End If
In the userevent for pbm_syscommand code (this example makes use of the PFC function of_BitwiseAnd):
n_cst_numerical lnv_Numerical
Constant Long ll_Mask = 65520
If lnv_Numerical.of_BitwiseAnd( commandtype, ll_Mask ) = SC_KEYMENU Then
If Message.LongParm = 0 And not ib_AltPressed Then
Do Something...
Return 1 // .. do not process this message any further
End If
End If
Before the wm_syscommand message is sent to your Window, a wm_syskeydown message is sent. This message is mapped to the PowerBuilder systemkey Window event. Because you can't know within the wm_syscommand message if the user pressed F10 or Alt, you can receive this information within the systemkey event. One drawback of this approach is: the systemkey event isn't triggered when the focus is on a editable DataWindow-column. In this case, you don't know what key was pressed to fire the wm_syscommand message.
There are some other messages. You can check them out at: