0

私は現在、Firefox の組み込みの更新サービス (メニュー -> ヘルプ -> について) を使用して Firefox を自動的に更新する簡単なプログラムの作成に取り組んでいます。ShellExecute を使用して Firefox を開き、sendInput を使用して、開いている Firefox ウィンドウにキーストローク 'Alt + h' および 'a' を送信しています。私のコードは現在、更新メニューを開くときに機能しますが、sendInput を呼び出す前に Firefox が開くのに十分な時間を与えるために、システム スリープ メソッド呼び出しを使用しています。Firefox が開いていて、キーボード入力を受け取る準備ができているかどうかを確認する方法はありますか? sendInput にこの機能を提供するメソッドが関連付けられているかどうかは不明であり、MSDN でこのトピックに関する情報をまだ見つけることができませんでした。ありがとう、

#include <Windows.h>
#include <exception>

const int ERROR_VALUE_RANGE = 32;

using namespace std;

//Method Declarations
void openProgram(char filePath[]);
void openUpdateMenu();


/**
 * exception class for throwing ShellExecute Exceptions
 * throws char* "Error opening program" if any issues arise
 */
class runException: public exception {

    virtual const char* what() const throw() {
        return "Error opening program";
    }

} runEx;

int main (void) {



    // Path to Mozilla Firefox
    char filePath[] = "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"; 

    // Start Firefox using openProgram Method
    try {
        openProgram(filePath);
    }
    catch (exception& e) {
        //Insert code to open dialog box displaying error message;
    }

    Sleep(5000); //sleep for one second while we wait for Windows Update to open

    openUpdateMenu();

    return 0;
}


/**
 * method openProgram opens a file using the ShellExecute method
 * @param filePath - a char array of the complete filepath
 */
void openProgram(char filePath[])  { // throws (runEx)

    HINSTANCE exReturn = ShellExecute(
        HWND_DESKTOP, // Parent is desktop
        "open",       // Opens file (explorer double click behavior)
        filePath,     // Path to Windows Update program
        NULL,         // Parameters
        NULL,         // Default Directory
        SW_SHOW);     // Show the program once it opens

    //if there are any issues opening the file the return value will be less than 32
    if ((int)exReturn <=  ERROR_VALUE_RANGE) { 
        throw runEx; //throws runException
    }

    return;
}

/**
 * method openUpdateMenu sends key commands to Firefox to open the about menu with the         update service
 */
void openUpdateMenu() {

    //set up keyboard emulation
    INPUT Input; //declare input object
    Input.type = INPUT_KEYBOARD;
    Input.ki.time = 0; //let system provide timestamp
    Input.ki.dwExtraInfo = 0;

    //simulate pressing alt down
    Input.ki.wVk = VK_LMENU;
    Input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
    SendInput(1, &Input, sizeof(INPUT));

    //simulate pressing 'h' down
    Input.ki.wVk = 0x48;
    Input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
    SendInput(1, &Input, sizeof(INPUT));

    //release alt key
    Input.ki.wVk = VK_LMENU;
    Input.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &Input, sizeof(INPUT));

    //release 'h' key
    Input.ki.wVk = 0x48;
    Input.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &Input, sizeof(INPUT));

    Sleep(500); // wait for menu to open

    //simulate pressing 'a' down
    Input.ki.wVk = 0x41 ;
    Input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
    SendInput(1, &Input, sizeof(INPUT));

    //release 'a' key
    Input.ki.wVk = 0x41 ;
    Input.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &Input, sizeof(INPUT));

    //wait a second so user can see the program work
    Sleep(1000);
}
4

0 に答える 0