- ベストアンサー
実行中のプログラムが自分を隠すため
そうしたい場所で SetWindowPos(hW,HWND_NOTOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE); としたのですが(hWはこのプログラムのメインウィンドウ)一旦はかくれるもののすぐに自分が前面に現れます どうしたら他の1つのプログラムのウィンドウに隠れた状態にする事ができるでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>ShowWindow(hW,SW_SHOWMAXIMIZED); >SetWindowPos(hW,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); >SetForegroundWindow(hW); >SetActiveWindow(hW); >SetFocus(hW); >SetActiveWindow(hW); これは余分 同一プロセス内でないと意味なし。 >SetFocus(hW); これもキーボードフォーカスなんで意味なし。 ということで、 GetForegroundWindow()とAttachThreadInput() 入れてみたらどうなります?
その他の回答 (4)
- kmb01
- ベストアンサー率45% (63/138)
自分を隠す必要はあるのですか? ボタンクリック時に 1、表示したい他のウィンドウを見つける 2、そのウィンドウを表示する(SetWindowPos(hW, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);) でいいのでは。 メモ帳終了時に自身を確実に表示したいなら WaitForSingleObjectでメモ帳の終了を感知する方法があります。
お礼
ありがとうございます メモ帳ではなくhtml(ie6.0で開く)でした このhtmlにzオーダを指定してトップにしてしまうとhtmlウィンドウを裏に表示することが難しくなり最小化ボタンを押さないと他のウィンドウを表示できなくなります そのため異常化したウィンドウになってしまい殺さないと以後の作業がしにくくなります またトップに表示されてもフォーカスは元の裏に隠れているプログラムウィンドウに戻ってしまうようでクリックしてフォーカスを新ウィンドウに切り替えなければなりません したがってやろうとしている事は自分をアイコン化や最小化しないと不可能ではないかと思います 表に表示させたWindowを殺したらすぐに元のプログラムウィンドウがフォーカスを持って現れる快適な状況は望めないかもしれませんね
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>としたのですが(hWはこのプログラムのメインウィンドウ)一旦はかくれるもののすぐに自分が前面に現れます ボタンをクリックしてるからだと。 >ウィンドウを見つけて最大化させてみたのですが前面表示されません アクティブにはなってます? 最前面にしたいウィンドウに一旦SetWindowPosでHWND_TOPMOSTをいったんつけて、HWND_NOTOPMOSTにしてあげると前に行くかな? あとは、ボタンを押してってことなんで、ボタンのクリック時には処理をせずに、PostMessageで自分宛に独自メッセージをポストし、ポストしたメッセージを受け取ってから他アプリの最前面化をしてみるのも効果があるかも。
お礼
ありがとうございます BOOL CALLBACK EnumProc(HWND hW,LPARAM) { char s[999]; SendMessage(hW,WM_GETTEXT,999,(LPARAM)s); if(string(s).find("MyWindow")!=string::npos) { ShowWindow(hW,SW_SHOWMAXIMIZED); SetWindowPos(hW,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); SetForegroundWindow(hW); SetActiveWindow(hW); SetFocus(hW); return FALSE; } return TRUE; } とWindow検索サブの方を変更したら前面表示されるようになりますが フォーカス(アクティブ?)がもらえないだけでなく タスクバーのほかのWindowをクリックしても MyWindowが前面表示されたままになってしまいます こちらがうまく行けばあちらが状態です SetWindowPosでZオーダをいじるのは危険ですね
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>最大化され前面に一旦はでるもののすぐに自分(動作をさせるプログラム)のWindowの裏に隠れてしまいます AttachThreadInput()使ってね。 http://mfc.acty-net.ne.jp/ml/mfc/logTop/logAll/00018016.htm
お礼
ありがとうございます したいことは以下の通りです 自分のWindow内のあるボタンをクリックしたら 既存か新規作成のメモ帳に情報を書きこんでそのメモ帳を最大化し前面に表示し メモ帳を×をクリックして殺したら 自分のウィンドウがフォーカスを持って現れるようにしたいのです だからHideだとメモ帳を殺した後も消えたままなのでまずいのです
補足
訂正します メモ帳ではなくhtmlファイルです ieが閉じているときには ウィンドウを見つけて最大化するような処理すらしなくても最大化前面表示してくれるのですが 既にieが開いているときには最大化も前面表示もされないので ウィンドウを見つけて最大化させてみたのですが前面表示されません
- taka_tetsu
- ベストアンサー率65% (1020/1553)
ShowWindowのSW_HIDEで消しちゃだめなの?
お礼
ありがとうございます 一番上のウィンドウの裏におき一番上のウィンドウが消されたらフォーカスを持った状態で現れるようにしたいのです
お礼
訂正します サブは BOOL CALLBACK EnumProc(HWND hW,LPARAM) { char s[999]; SendMessage(hW,WM_GETTEXT,999,(LPARAM)s); if(string(s).find("MyWindow")!=string::npos) { ShowWindow(hW,SW_SHOWMAXIMIZED); DWORD dw_html=GetWindowThreadProcessId(hW,NULL); DWORD dw_main=GetWindowThreadProcessId(hWmain,NULL); AttachThreadInput(dw_main,dw_html,TRUE); SetForegroundWindow(hW); AttachThreadInput(dw_html,dw_main,FALSE); return FALSE; } return TRUE; } メインの処理場所は ofs.open("MyWindow.html"); ofs<<"<title>MyWindow</title>"<<endl; ofs.close(); ShellExecute(NULL,"open","MyWindow.html",NULL,NULL,SW_SHOWMAXIMIZED); EnumWindows(&EnumProc,NULL); です
補足
度々ありがとうございます サブを BOOL CALLBACK EnumProc(HWND hW,LPARAM) { char s[999]; SendMessage(hW,WM_GETTEXT,999,(LPARAM)s); if(string(s).find(str_html)!=string::npos) { DWORD dwPid; DWORD dwTidNow=GetWindowThreadProcessId(hW,&dwPid); DWORD dwTidMe=GetCurrentThreadId(); AttachThreadInput(dwTidMe,dwTidNow,TRUE); ShowWindow(hW,SW_SHOWMAXIMIZED); SetForegroundWindow(hW); AttachThreadInput(dwTidNow,dwTidMe,FALSE); return FALSE; } return TRUE; } とし メインのボタンの処理を case IDOUT: ofs.open("MyWindow.html"); ofs<<"<html><title>MyWindow</title></html>"<<endl; ofs.close(); ShellExecute(NULL,"open","MyWindow.html",NULL,NULL,SW_SHOWMAXIMIZED); EnumWindows(&EnumProc,NULL); break; としましたが結局自分にフォーカスが戻ると共に自分が前面表示されます 自分が最小化しないとフォーカスを他のWindowに渡すのは不可能みたいですね? 先のZオーダを変えた異常Windowが前面表示されたのは異常がゆえにフォーカスが自分に戻っても異常Windowが後ろに回れないからで 問題はフォーカスをいかに自分以外のWindowにうつすかという問題1つだとおもいます マイクロソフトの仕様上不可能かもしれませんね?