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で質問しましょう!
似たような質問が見つかりました
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- Visual Basic(VBA) VBA 配列を使ったコードに直していただけますか 4 2023/05/06 15:18
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
外字文字の登録
-
【VB.NET】指定時刻にアプリケ...
-
初回接続の遅い原因について
-
使用しているEXEファイルから、...
-
WSH(VBScript)でアプリケーショ...
-
Shell関数の終了を調べる方法
-
自分自身を更新するプログラム
-
C言語でPDFファイルのサイズと...
-
フレームワーク「4.8.1」で、[S...
-
対象のアプリケーションが終了...
-
WoW64経由と通常の32bit起動は...
-
PHPでのsystem関数の処理ができ...
-
C# の OpenFileDialog
-
MFCでコンソール出力
-
VC++2010 画面なしのアプリケ...
-
実行時のコマンドプロンプトを...
-
VB.NETで起動させたExcelの多重...
-
Windowsプログラムのビジー状態...
-
現在起動中のアプリケーション...
-
アプリケーションをVBS(WSH?)で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンソールアプリケーションの...
-
Vba アプリケーションが立ち上...
-
フレームワーク「4.8.1」で、[S...
-
VBSでのSendKeysでの画面の最小化
-
イラストレーターCS4のシリアル...
-
vb6で異なるのプロジェクト間で...
-
初回接続の遅い原因について
-
VB.NETでMessageBoxを表示した...
-
MFCアプリケーションでの終了コ...
-
pccNTmon.exeとntrtscan.exeの違い
-
Windowsプログラムのビジー状態...
-
実行時のコマンドプロンプトを...
-
自分自身を更新するプログラム
-
VB.NETでフォームアクティブの...
-
Accessフォームからの外部アプ...
-
Console Applicationをタスクト...
-
httpd.pidって何ですか?
-
VB.NETで起動させたExcelの多重...
-
vcxprojファイルの修正法???
-
「AcroRd32.exe」これってウイ...
おすすめ情報