お世話になっております。 環境: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, タイトル名*);
どなたかいい方法があれば教えて下さい。
お願い致します。
ウィンドウクラス名を指定して、
FindWindowEx()の第3引数で検索するのはダメ?
結論から言いますと、ダメでした…。
「B.exe」の起動直後に、FindWindowExでハンドル取得して、
GetClassNameでみてみたのですが、「B.exe」のクラス名が起動毎に毎回違いました。
Spy++で見ても同様でした…。
多重起動防止は、FindWindow でダメなら Mutex を使うのが一般的です。
「A.exe」から「B.exe」を起動したのであれば、Mutexでいいと思うのですが、
今回は、「B.exe」がダブルクリックで起動できてしまうので、
その時は、Mutexだと「A.exe」からの検知はできませんよね…。
あきらめるのは、まだ早いです。
クラス名が毎回違うと言うことは、なんらかのクラスライブラリを使ってます?
SDKを使って、自分でウィンドウを作っていれば、そんなことはないはずですので。
だとしたら、自分の好きな名前に固定しちゃえばいいんです。
仮にMFCウィンドウだとすると、以下の方法で固定できます。
http://support.microsoft.com/kb/403825/ja
bunさん。
クラス名の固定で出来ました。
助かりました。本当にありがとうございました。
皆様もご協力ありがとうございました。
解決済み後の回答なのでレス不要。こんな手も或るって事で。
> 「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;
}
----------------