WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW;
MSGms;
//ここで前起動クローンのアプリやWindowのハンドルを取得したい
wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=NULL;
wc.cbWndExtra=NULL;
wc.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
RegisterClass(&wc);
hW=CreateWindow
(
"goo",
"教えてgoo!",WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU,
0,
0,
640,
456,
NULL,
NULL,
hI,
NULL
);
ShowWindow(hW,nCS);
UpdateWindow(hW);
while(GetMessage(&ms,NULL,NULL,NULL))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
return (ms.wParam);
}
上記アプリで//行で前起動時のWindowのハンドルを得るにはどうしたらいいのでしょうか?
No.2ベストアンサー
- 回答日時:
アプリケーションの2重起動を防止するには?
さらにウィンドウをアクティブ化するには?
http://techtips.belution.com/ja/vc/0025/
がよくまとまってそうです。
補足
SetForegroundWindow はOSによって挙動が異なります。
http://www.microsoft.com/JAPAN/developer/library …
最上位にできるとは限りません。
参考URL:http://techtips.belution.com/ja/vc/0025/
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASS wc;
HWND hW,hPW;
MSG ms;
HANDLE hMutex;
hPW=FindWindow("goo","教えてgoo!");
hMutex=CreateMutex(NULL,TRUE,"UniqueName");
if(!hMutex)return FALSE;
if (GetLastError()==ERROR_ALREADY_EXISTS)
{
ShowWindow(hPW,SW_RESTORE);
SetForegroundWindow(hPW);// 単純にここに追加しただけ
return FALSE;
}
wc.lpszClassName ="goo";
wc.lpfnWndProc =(WNDPROC)WinProcedure;
wc.hInstance =hI;
wc.style =CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra =NULL;
wc.cbWndExtra =NULL;
wc.hIcon =LoadIcon(NULL,IDI_EXCLAMATION);
wc.hCursor =LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName =NULL;
RegisterClass(&wc);
hW=CreateWindow
(
"goo",
"教えてgoo!", WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU,
0,
0,
640,
456,
NULL,
NULL,
hI,
NULL
);
ShowWindow(hW,nCS);
UpdateWindow(hW);
while(GetMessage(&ms,NULL,NULL,NULL))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
return (ms.wParam);
}
参考サイトの記述を参考に上記のように単純にSetForegroundWindowを追加したら動き出しました
参考サイトは難しいことをいろいろと書いてましたが単純に上記のようにしたらまずいのでしょう?
よろしくお願いします
No.1
- 回答日時:
FindWindow や EnumWindows を使う。
この回答への補足
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASS wc;
HWND hW,hPW;
MSG ms;
HANDLE hMutex;
hPW=FindWindow("goo","教えてgoo!");
hMutex=CreateMutex(NULL,TRUE,"UniqueName");
if(!hMutex)return FALSE;
if (GetLastError()==ERROR_ALREADY_EXISTS)
{
ShowWindow(hPW,SW_SHOWNORMAL);
return FALSE;
}
wc.lpszClassName ="goo";
wc.lpfnWndProc =(WNDPROC)WinProcedure;
wc.hInstance =hI;
wc.style =CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra =NULL;
wc.cbWndExtra =NULL;
wc.hIcon =LoadIcon(NULL,IDI_EXCLAMATION);
wc.hCursor =LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName =NULL;
RegisterClass(&wc);
hW=CreateWindow
(
"goo",
"教えてgoo!", WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU,
0,
0,
640,
456,
NULL,
NULL,
hI,
NULL
);
ShowWindow(hW,nCS);
UpdateWindow(hW);
while(GetMessage(&ms,NULL,NULL,NULL))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
return (ms.wParam);
}
実は再起動防止のプログラムを作っているのですが上のようにすると既起動分が最小化されている場合には再実行すると再起動はされずに既起動分が通常表示になり最上位に表示されるのですが
既起動分が最小化されていないで隠れているだけのときには再実行しても(再起動されないのは同じですが)既起動分を最上位に表示してくれずに隠れたままになるのです
どうすれば良いか教えてください
よろしくお願いします
ShowWindow(hPW,SW_SHOWNORMAL);
のところを
ShowWindow(hPW,SW_MINIMIZE);
ShowWindow(hPW,SW_SHOWNORMAL);
とするしかないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでMessageBoxを表示した...
-
コンソールアプリケーションの...
-
Vba アプリケーションが立ち上...
-
MFCアプリケーションでの終了コ...
-
VBSで2バイト文字の送り方の質...
-
現在起動中のアプリケーション...
-
VBSでのSendKeysでの画面の最小化
-
スクリーンセイバーのタイマー...
-
イラストレーターCS4のシリアル...
-
Accessフォームからの外部アプ...
-
他アプリケーションの終了
-
WSH(VBScript)でアプリケーショ...
-
外部アプリケーションの起動に...
-
outlookが強制終了してしまう
-
自分自身を更新するプログラム
-
Ms draw を使ってみたい
-
EXEファイルのタイトル取得
-
[Visual C++]VCが起動しません...
-
FOM出版の公認テキスト&問題集...
-
初回接続の遅い原因について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSでのSendKeysでの画面の最小化
-
Vba アプリケーションが立ち上...
-
コンソールアプリケーションの...
-
Accessフォームからの外部アプ...
-
pccNTmon.exeとntrtscan.exeの違い
-
Windowsプログラムのビジー状態...
-
自分自身を更新するプログラム
-
フレームワーク「4.8.1」で、[S...
-
VB.NETでMessageBoxを表示した...
-
C#でGUI・CUIの判断する仕方を...
-
現在起動中のアプリケーション...
-
実行時のコマンドプロンプトを...
-
VB6での二重起動(複数起動)の制...
-
VB.NETでフォームアクティブの...
-
Console Applicationをタスクト...
-
コマンドライン版ソフトの意義
-
イラストレーターCS4のシリアル...
-
MFCアプリケーションでの終了コ...
-
vb6で異なるのプロジェクト間で...
-
OSによるWinExecの動...
おすすめ情報