Problema al enviar combinación de teclas con PostMessage

Iniciado por ramiro069, 12 Octubre 2016, 16:19 PM

0 Miembros y 1 Visitante están viendo este tema.

ramiro069

Buenas, estoy intentando hacer un programa para enviar una combinación de teclas (Ctrl+Alt+F12) a un programa en segundo plano, para ello estoy usando la función PostMessage de la API de windows, el caso es que si envío solo F12 o Ctrl funciona (el ALT no) pero si intento usar una combinación de ambas no, el código que estoy usando es este:
HWND windowHandle = FindWindowA("Qt5QWindowIcon", NULL);   //Can't find a proccess

   //Send a key
   if( windowHandle ) //This one fails
   {
              PostMessage(windowHandle, WM_SYSKEYDOWN, VK_CONTROL, 0);
              PostMessage(windowHandle, WM_SYSKEYDOWN, VK_MENU, 0);
              PostMessage(windowHandle, WM_KEYDOWN, VK_F12, 0);
              Sleep(1000);
              PostMessage(windowHandle, WM_KEYUP, VK_F12, 0);
              PostMessage(windowHandle, WM_SYSKEYUP, VK_MENU, 0);
              PostMessage(windowHandle, WM_SYSKEYUP, VK_CONTROL, 0);
   }else{
     cout << "No se ha encontrado la ventana!!" << endl;
   }


Por otro lado he intentado con keybd_event y envía bien las teclas, pero si tengo la ventana en primer plano (y no es lo que quiero)
      keybd_event(VK_CONTROL, 0x9d, 0, 0);
     keybd_event(VK_MENU, 0xb8, 0, 0);
     keybd_event(VK_F12, 0xd8, 0, 0);
     Sleep(1000);
     keybd_event(VK_F12, 0xd8, KEYEVENTF_KEYUP, 0);
     keybd_event(VK_MENU, 0xb8, KEYEVENTF_KEYUP, 0);
     keybd_event(VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, 0);


Se que en el foro habéis hablado ya de estas funciones, pero no logro encontrar el problema de mi código, y simplemente agradeceros vuestra ayuda.


EDITO: Lo he conseguido solucionar, la manera correcta es la siguiente:
   if( windowHandle ) //This one fails
   {
              PostMessage(windowHandle, WM_SYSKEYDOWN, VK_CONTROL, 0x209d0000);
              PostMessage(windowHandle, WM_KEYDOWN, VK_F12, 0x00d80000);
              Sleep(1000);
              PostMessage(windowHandle, WM_KEYUP, VK_F12, 0xc0d80000);
              PostMessage(windowHandle, WM_SYSKEYUP, VK_CONTROL, 0xe09d0000);
   }else{
     cout << "No se ha encontrado la ventana!!" << endl;
   }


El problema eran los Lparams.
NOTA: La pulsación de la tecla ALT se realiza por medio del Lparam de WM_SYSKEYDOWN.