Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ramiro069 en 12 Octubre 2016, 16:19 pm



Título: Problema al enviar combinación de teclas con PostMessage
Publicado por: ramiro069 en 12 Octubre 2016, 16:19 pm
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:
Código:
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)
Código:
       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:
Código:
    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.