他プロセスのハンドル取得 – プログラミング – Home

他プロセスのハンドル取得
 
通知
すべてクリア

[解決済] 他プロセスのハンドル取得


ゆう
 ゆう
(@ゆう)
ゲスト
結合: 23年前
投稿: 114
Topic starter  

お世話になっております。  環境: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
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

ウィンドウクラス名を指定して、
FindWindowEx()の第3引数で検索するのはダメ?


返信引用
ゆう
 ゆう
(@ゆう)
ゲスト
結合: 23年前
投稿: 114
Topic starter  

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

多重起動防止は、FindWindow でダメなら Mutex を使うのが一般的です。


返信引用
ゆう
 ゆう
(@ゆう)
ゲスト
結合: 23年前
投稿: 114
Topic starter  

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


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

あきらめるのは、まだ早いです。

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

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


返信引用
ゆう
 ゆう
(@ゆう)
ゲスト
結合: 23年前
投稿: 114
Topic starter  

bunさん。
クラス名の固定で出来ました。
助かりました。本当にありがとうございました。
皆様もご協力ありがとうございました。


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

解決済み後の回答なのでレス不要。こんな手も或るって事で。

> 「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;
}
----------------


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました