Una solución usando un Hook al teclado:
Código:
HHOOK WHookKeyboard = 0;
//---------------------------------------------------------------------------
LRESULT CALLBACK KeyboardHookCallBack(int Code, WPARAM wParam, LPARAM lParam)
{
if(Code == HC_ACTION){
// PKBDLLHOOKSTRUCT hs = (PKBDLLHOOKSTRUCT)lParam;
PKBDLLHOOKSTRUCT hs = reinterpret_cast<PKBDLLHOOKSTRUCT>(lParam);
if (hs->vkCode == VK_F1 && hs->flags ==0){
HWND hWnd = 0;
HWND hWndc = 0;
hWnd = FindWindow("NotePad", 0);
hWndc = FindWindowEx(hWnd, 0,0,0);
SetForegroundWindow(hWndc);
::SetFocus(hWndc);
char cadena[] = "HOLA";
for(int n=0; n<strlen(cadena); n++){
PostMessage(hWndc, WM_CHAR, cadena[n], 0);
}
}
}
// Permitimos el proceso del resto del teclado.
return CallNextHookEx(WHookKeyboard, Code, wParam, lParam);
}
//---------------------------------------------------------------------------
bool Hook()
{
if(WHookKeyboard == 0) {
WHookKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, reinterpret_cast<HOOKPROC>(KeyboardHookCallBack), HInstance, 0);
// Antigua y clásica forma de hacer el casting
// WHookKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardHookCallBack, HInstance, 0);
}
return (bool)WHookKeyboard;
}
//---------------------------------------------------------------------------
void UnHook()
{
UnhookWindowsHookEx(WHookKeyboard);
WHookKeyboard = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
if(CheckBox1->Checked) Hook();
else UnHook();
}
//---------------------------------------------------------------------------
Saludos.