I'm writing a custom control derived from System.Windows.Forms.Control
.
The control is using the Control.KeyDown
event, to watch keystrokes: I should handle some keystrokes (for example <Ctrl>-K
) as hotkeys, which cause me to launch a dialog box.
If I launch the dialog from my onKeyDown
event handler, the dialog is displayed before I set KeyEventArgs.SuppressKeyPress
to true
and return (and so I'm failing to suppress the K
keypress). Instead, I'd like to return from the onKeyDown
event handler, and launch the dialog afterwards. To do this, after I return from the onKeyDown
event handler I need to be invoked again somehow, with some kind of 'launch the dialog' event.
On Win32, I could generate this event by using the PostMessage
API, to send a registered window message to myself: I would receive this message right after any previous message in my message queue, and use it as the signal to launch my dialog. Here however I can't use PostMessage
function (nor the WndProc
method) because I want to use strictly managed APIs (without needing SecurityPermissionFlag::UnmanagedCode
).
So what would be the managed equivalent, for a thread (my UI thread) to schedule an asynchronous callback: perhaps a timer of some kind? Some kind of self-Invoke
?