c++ builder XE4, 10.2 Tokyo > 他アプリを見つける > 1. captionでの見つけ方


動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)

注意

(追記 2018/11/14)

以下で使用しているZeroMemoryは最適化で吹き飛ぶため、SecureZeroMemory()の使用が推奨されます。

内容

http://qiita.com/7of9/items/7b8e8e5ec4111df6dcf5
の続き。

開いたアプリを見つけたい。

HWNDなりプロセス番号なりで見つけたいが、とりあえずできたのはウィンドウキャプションでの見つけ方。

try1

Unit1.cpp
void __fastcall TParentForm::App_openOther(String param)
{
    String progname = L"childProject.exe";
    if (FileExists(progname) == false) {
        ShowMessage(L"childProejct.exe not found");
        return;
    }

    TShellExecuteInfo sinfo;

    ::ZeroMemory(&sinfo,sizeof(SHELLEXECUTEINFO));
    sinfo.cbSize = sizeof(sinfo);
    sinfo.hwnd = 0; // Desktop
    sinfo.fMask = SEE_MASK_FLAG_DDEWAIT;
    sinfo.lpFile = progname.c_str();
    sinfo.lpParameters = param.c_str();
    sinfo.lpVerb = L"";
    sinfo.nShow = SW_SHOWNORMAL;

    ShellExecuteEx(&sinfo);

    // 起動待ち
    WaitForInputIdle(sinfo.hProcess, INFINITE);
}

void __fastcall TParentForm::App_findCaptionOf(String caption)
{
    String suffix;

    int len = String(L"/caption=").Length();
    suffix = caption.Delete(1, len);

    suffix = StringReplace(suffix, L"_", L" ", TReplaceFlags()<<rfReplaceAll);

    String fullCaption = L"childProject";
    fullCaption = fullCaption + L" / " + suffix;


    HWND appHwnd;

    appHwnd = FindWindowEx(NULL, NULL, NULL, fullCaption.c_str());
    if (appHwnd != NULL) {
        String msg = L"found:" + caption;
        OutputDebugString(msg.c_str());
    }

}


void __fastcall TParentForm::B_createClick(TObject *Sender)
{
    App_openOther(L"/caption=Test_3_1_4");
}
//---------------------------------------------------------------------------

void __fastcall TParentForm::B_foundClick(TObject *Sender)
{
    App_findCaptionOf(L"/caption=Test_3_1_4");
}
//---------------------------------------------------------------------------

以下のように見つけることができた。

結果
デバッグ出力: found:Test_3_1_4 プロセス parentProject.exe (2312)

try2

以下において、全部のキャプション文字列を渡すように変更した

Unit1.cpp
void __fastcall TParentForm::App_findFullCaptionOf(String fullCaption)
{
    HWND appHwnd;

    appHwnd = FindWindowEx(NULL, NULL, NULL, fullCaption.c_str());
    if (appHwnd != NULL) {
        String msg = L"found2:" + fullCaption;
        OutputDebugString(msg.c_str());
    }

}

void __fastcall TParentForm::B_foundClick(TObject *Sender)
{
    App_findCaptionOf(L"/caption=Test_3_1_4");

    App_findFullCaptionOf(L"childProject / Test 3 1 4");
}

App_findFullCaptionOf()の方では"_"から" "への変換は省略している。