I need to detect when a user presses Ctrl+V(regardless of window focus - my app will likely be minimised) but I must not stop the actual paste operation.
I have tried a few things: (I am successfully binding to keystrokes with RegisterHotKey)
I have:
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x312)
hotKey();
base.WndProc(ref m);
}
and I've tried the following:
void hotKey()
{
SendKeys.SendWait("^v"); //just puts 'v' instead of clipboard contents
}
and
void hotKey()
{
SendKeys.SendWait(ClipBoard.GetText());
/* This works, but since Ctrl is still down, it triggers
* all the shortcut keys for the app, e.g. if the keyboard
* contains 's' then instead of putting 's' in the app, it
* calls Ctrl+S which makes the app think the user wants
* to save.
*/
}
Currently the only working solution I have is to bind to something different, e.g. Ctrl+B and then call SendKeys.SendWait("^v");
however this isn't ideal.
An ideal solution would be if my window didn't intercept the keystroke in the first place, just reacted.
You can do this by leveraging hooks using SetWindowsHookEx().
Basically, you can set up a low-level keyboard hook:
to capture system-wide keyboard events. But it also allows you to make those keyboard events pass through to other apps. For your particular case, you can define
KbHookProc
as:I coded a quick and dirty WinForms app to illustrate this. For the full code listing, see http://pastebin.com/uCSvqwb4.