プロが教える店舗&オフィスのセキュリティ対策術

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のハンドルを得るにはどうしたらいいのでしょうか?

A 回答 (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/
    • good
    • 0
この回答へのお礼

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を追加したら動き出しました
参考サイトは難しいことをいろいろと書いてましたが単純に上記のようにしたらまずいのでしょう?

よろしくお願いします

お礼日時:2003/03/19 14:02

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

実は再起動防止のプログラムを作っているのですが上のようにすると既起動分が最小化されている場合には再実行すると再起動はされずに既起動分が通常表示になり最上位に表示されるのですが
既起動分が最小化されていないで隠れているだけのときには再実行しても(再起動されないのは同じですが)既起動分を最上位に表示してくれずに隠れたままになるのです
どうすれば良いか教えてください
よろしくお願いします

補足日時:2003/03/19 01:05
    • good
    • 0
この回答へのお礼

ShowWindow(hPW,SW_SHOWNORMAL);

のところを

ShowWindow(hPW,SW_MINIMIZE);
ShowWindow(hPW,SW_SHOWNORMAL);

とするしかないのでしょうか?

お礼日時:2003/03/19 01:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!