Necesitas crear un keyloger de teclado. Busca informacion ya que es muy sencillo y te permite detectar cualquier pulsacion de cualquier tecla del teclado incluidas las especiales.
Si no das con la tecla avisa y te busco un ejemplo que tengo por ahi.
EDITO: Encontré el proyecto que tengo de ejemplo aunque es para Borland C++Builder pero es practicamente igual, solo cambia los eventos de los botones y poco mas ya que usa APIs de Windows:
Código C++:
Ver original//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define OK -32767 //Necesario para el keylogger
LRESULT WINAPI KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam);
TForm1 *Form1;
HHOOK hKeyboardHook;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonColocarHookClick(TObject *Sender)
{
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardEvent, GetModuleHandle(NULL), 0);
ButtonColocarHook->Enabled = false;
ButtonQuitarHook->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonQuitarHookClick(TObject *Sender)
{
UnhookWindowsHookEx(hKeyboardHook);
ButtonColocarHook->Enabled = true;
ButtonQuitarHook->Enabled = false;
}
//---------------------------------------------------------------------------
LRESULT WINAPI KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam)
{
if( (nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN)) ){
if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_SHIFT))
{
switch(*(PDWORD)lParam)
{
case 'C': //Ctrl+Shift+C
MessageBox(NULL,"Has pulsado Ctrl+Shift+C.","Atención", MB_OK | MB_ICONINFORMATION);
break;
case 'V': //Ctrl+Shift+V
MessageBox(NULL,"Has pulsado Ctrl+Shift+V.","Atención", MB_OK | MB_ICONINFORMATION);
break;
}
}else if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_MENU))
{
switch(*(PDWORD)lParam)
{
case 'C': //Ctrl+Alt+C
MessageBox(NULL,"Has pulsado Ctrl+Alt+C.","Atención", MB_OK | MB_ICONINFORMATION);
break;
case 'V': //Ctrl+Alt+V
MessageBox(NULL,"Has pulsado Ctrl+Alt+V.","Atención", MB_OK | MB_ICONINFORMATION);
break;
}
}else if(GetAsyncKeyState(VK_CONTROL))
{
switch(*(PDWORD)lParam)
{
case 'C': //Ctrl+C
MessageBox(NULL,"Has intentado copiar al portapapeles usando Ctrl+C.","Atención", MB_OK | MB_ICONINFORMATION);
break;
case 'V': //Ctrl+V
MessageBox(NULL,"Has intentado pegar desde el portapapeles usando Ctrl+V.","Atención", MB_OK | MB_ICONINFORMATION);
break;
}
}else if(GetAsyncKeyState(VK_MENU))
{
switch(*(PDWORD)lParam)
{
case 'C': //Alt+C
MessageBox(NULL,"Has pulsado Alt+C.","Atención", MB_OK | MB_ICONINFORMATION);
break;
case 'V': //Alt+V
MessageBox(NULL,"Has pulsado Alt+V.","Atención", MB_OK | MB_ICONINFORMATION);
break;
}
}else if(GetAsyncKeyState(VK_SHIFT)){
switch(*(PDWORD)lParam)
{
case 'C': //Shift+C
MessageBox(NULL,"Has pulsado Shift+C.","Atención", MB_OK | MB_ICONINFORMATION);
break;
case 'V': //Shift+V
MessageBox(NULL,"Has pulsado Shift+V.","Atención", MB_OK | MB_ICONINFORMATION);
break;
}
}else{
switch(*(PDWORD)lParam)
{
case 'C': //C
MessageBox(NULL,"Has pulsado C.","Atención", MB_OK | MB_ICONINFORMATION);
break;
case 'V': //V
MessageBox(NULL,"Has pulsado V.","Atención", MB_OK | MB_ICONINFORMATION);
break;
}
}
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardEvent, GetModuleHandle(NULL), 0);
ButtonColocarHook->Enabled = false;
ButtonQuitarHook->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
UnhookWindowsHookEx(hKeyboardHook);
ButtonColocarHook->Enabled = true;
ButtonQuitarHook->Enabled = false;
}
//---------------------------------------------------------------------------
Eso si, yo lo hice para controlar solo las teclas C y V con todas sus combinaciones, si quieres controlar todo todo mejor create una funcion la cual obtenga la tecla pulsada y llamas desde cada situacion para hacer el codigo mas pequeño porque si no vas ha tener un codigo espaguetis de la ostia jajaja.