他プロセスのハンドル取得

[戻る]
ゆう 2008/12/09(火) 14:36:53
お世話になっております。  環境:VC2003 Windows xp

「A.exe」から「B.exe」にSendMessageを出したいと思っています。
条件は、
・「B.exe」は、「A.exe」からでも、「B.exe」をダブルクリックでも起動が可能です。
・「B.exe」は、どちらかが起動をかけても多重起動は不可です。
・「A.exe」も「B.exe」もMDIです。

困っている事は、
「B.exe」をダブルクリックで起動した時、「A.exe」から見て「B.exe」が起動している
事が分かりません。
FindWindowExを使って、HWNDを取得しようとしたのですが、
タイトル名は、秀丸のようにファイルを開くと名称が変わってしまい。
「B.exe」が何もしていない状態(起動した直後)しか、SendMessageが出せません。
クラス名も、毎回「B.exe」を起動すると名称が違うんです…。

分かっていることは、「B.exe」のフルパスだけです。

FindWindowExで"*"とか使えないですよね。試してダメだったんですが…。
hwnd = ::FindWindowEx(NULL, NULL, NULL, "タイトル名*");

どなたかいい方法があれば教えて下さい。
お願い致します。

bun 2008/12/09(火) 15:07:56
ウィンドウクラス名を指定して、
FindWindowEx()の第3引数で検索するのはダメ?

ゆう 2008/12/09(火) 15:29:14
結論から言いますと、ダメでした…。
「B.exe」の起動直後に、FindWindowExでハンドル取得して、
GetClassNameでみてみたのですが、「B.exe」のクラス名が起動毎に毎回違いました。
Spy++で見ても同様でした…。

aetos 2008/12/09(火) 16:08:09
多重起動防止は、FindWindow でダメなら Mutex を使うのが一般的です。

ゆう 2008/12/09(火) 16:23:59
「A.exe」から「B.exe」を起動したのであれば、Mutexでいいと思うのですが、
今回は、「B.exe」がダブルクリックで起動できてしまうので、
その時は、Mutexだと「A.exe」からの検知はできませんよね…。

bun 2008/12/09(火) 16:24:04
あきらめるのは、まだ早いです。

クラス名が毎回違うと言うことは、なんらかのクラスライブラリを使ってます?
SDKを使って、自分でウィンドウを作っていれば、そんなことはないはずですので。

だとしたら、自分の好きな名前に固定しちゃえばいいんです。
仮にMFCウィンドウだとすると、以下の方法で固定できます。
http://support.microsoft.com/kb/403825/ja

ゆう 2008/12/09(火) 17:02:01
[[解決]]
bunさん。
クラス名の固定で出来ました。
助かりました。本当にありがとうございました。
皆様もご協力ありがとうございました。

gak 2008/12/09(火) 17:30:35
解決済み後の回答なのでレス不要。こんな手も或るって事で。

> 「A.exe」から「B.exe」にSendMessageを出したいと思っています。
B.exe の WM_CREATE 辺りで
----------------
HANDLE 適当値 = 1; // NULL だと GetProp() の戻値で判断できない
::SetProp(hWnd, _T("uniqueとなる適当な文字列"), 適当値); 
// WM_DESTROY 辺りで RemoveProp() 忘れずに
----------------

A.exe の 適当な辺りで
----------------
xxx() {
    HWND wnd = NULL;
    ::EnumWindows(&enumfunc, &wnd);
    if (wnd != NULL) {
        ::SendMessage(wnd, ...);
    }
}

BOOL CALLBACK enumfunc(HWND wnd, LPARAM p) {
    if (::GetProp(wnd, _T("uniqueとなる適当な文字列")) == 適当値) {
        *(HWND*)p = wnd;
        return FALSE;
    }
    return TRUE;
}
----------------

古いスレッドには追加発言できません。