Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて  
ホーム >> システム >> 任意のアプリケーションをプログラムで操作するには

任意のアプリケーションをプログラムで操作するには

  自分で作成したアプリケーションは、外部から操作するための窓口を用意することにより、他のプロセスから操作することは簡単です。しかし、ソースコードの存在しないアプリケーションを操作したい場合、窓口が用意されていません。
  その場合は、そのアプリケーションのウィンドウハンドルを取得し、SendMessageによりメッセージを送信したり、キーボードやマウスの操作をエミュレートして行う必要が出てきます。

  方法としては、すでにアプリケーションが起動している場合はEnumWindows APIで操作したいウィンドウを探します(子ウィンドウの場合は、さらにEnumChildWindows APIで列挙する必要があります)。そして、そのプロセスの操作したい特定のウィンドウを見つけた場合、そのウィンドウへSendMessageをするか、もしくはウィンドウをアクティブにして、mouse_event APIやkeybd_event APIで、マウスやキーの押下をエミュレートします。

  下記は、"電卓"が起動していた場合、自動でAltキー、Hキー、Aキーを押して、バージョン情報を表示するサンプルです。

■■■ opcalc.exe プロジェクト
■ main.cpp


#include <windows.h>


HWND g_hWndCalc = NULL;

// calc.exeを探す
BOOL CALLBACK EnumWindowsProc ( HWND hWnd,
   LPARAM lParam )
{
    BOOL bResult;

    // タイトルを取得
    int nLength = GetWindowTextLength ( hWnd );
    char *pszTitle = new char[ nLength + 1 ];
    memset ( pszTitle, 0, nLength + 1 );

    GetWindowText ( hWnd, pszTitle, nLength + 1 );
    // タイトルが"電卓"のときは成功
    if ( 0 == lstrcmp ( "電卓", pszTitle ) )
    {
        g_hWndCalc = hWnd;
        bResult = FALSE;
    }
    else
    {
        bResult = TRUE;
    }

    delete[] pszTitle;

    return bResult;
}

int WINAPI WinMain ( HINSTANCE,
    HINSTANCE,
    char *,
    int )
{
    // 電卓のウィンドウハンドルを取得する
    EnumWindows ( EnumWindowsProc, 0 ); 

    // 電卓が起動していないとき
    if ( NULL == g_hWndCalc )
    {
        MessageBox ( NULL,
            "電卓が起動してから実行してください",
            "エラー",
            MB_ICONSTOP | MB_OK );

        return 0;
    }
    else
    {
        MessageBox ( NULL,
            "OKを押した後、300ms後に電卓のバージョン情報を表示するための自動操作を行います",
            "確認",
            MB_OK );
    }

    // 念のため、300ms待機
    Sleep ( 300 );

    // 電卓をアクティブにする
    SetForegroundWindow ( g_hWndCalc );

    // Alt Keyを押す(メニューを選択)
    keybd_event ( VK_MENU, 0, 0, NULL );
    Sleep ( 0 );// 0ms待機
    keybd_event ( VK_MENU, 0, KEYEVENTF_KEYUP, NULL );

    Sleep ( 300 );// 300ms待機

    // H Keyを押す(ヘルプを選択)
    keybd_event ( 'H', 0, 0, NULL );
    Sleep ( 0 );// 0ms待機
    keybd_event ( 'H', 0, KEYEVENTF_KEYUP, NULL );

    Sleep ( 300 );// 300ms待機

    // A Keyを押す(バージョン情報を選択)
    keybd_event ( 'A', 0, 0, NULL );
    Sleep ( 0 );// 0ms待機
    keybd_event ( 'A', 0, KEYEVENTF_KEYUP, NULL );

    return 0;
}
                            
                            
  ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて Copyright © 2014 A.Morita