dポイントプレゼントキャンペーン実施中!

そうしたい場所で

SetWindowPos(hW,HWND_NOTOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE);

としたのですが(hWはこのプログラムのメインウィンドウ)一旦はかくれるもののすぐに自分が前面に現れます
どうしたら他の1つのプログラムのウィンドウに隠れた状態にする事ができるでしょうか?

A 回答 (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()
入れてみたらどうなります?

この回答への補足

度々ありがとうございます

サブを

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つだとおもいます
マイクロソフトの仕様上不可能かもしれませんね?

補足日時:2004/11/01 22:00
    • good
    • 0
この回答へのお礼

訂正します

サブは

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

です

お礼日時:2004/11/01 22:41

自分を隠す必要はあるのですか?


ボタンクリック時に
1、表示したい他のウィンドウを見つける
2、そのウィンドウを表示する(SetWindowPos(hW, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);)
でいいのでは。

メモ帳終了時に自身を確実に表示したいなら
WaitForSingleObjectでメモ帳の終了を感知する方法があります。
    • good
    • 0
この回答へのお礼

ありがとうございます

メモ帳ではなくhtml(ie6.0で開く)でした
このhtmlにzオーダを指定してトップにしてしまうとhtmlウィンドウを裏に表示することが難しくなり最小化ボタンを押さないと他のウィンドウを表示できなくなります
そのため異常化したウィンドウになってしまい殺さないと以後の作業がしにくくなります
またトップに表示されてもフォーカスは元の裏に隠れているプログラムウィンドウに戻ってしまうようでクリックしてフォーカスを新ウィンドウに切り替えなければなりません
したがってやろうとしている事は自分をアイコン化や最小化しないと不可能ではないかと思います
表に表示させたWindowを殺したらすぐに元のプログラムウィンドウがフォーカスを持って現れる快適な状況は望めないかもしれませんね

お礼日時:2004/11/01 11:02

>としたのですが(hWはこのプログラムのメインウィンドウ)一旦はかくれるもののすぐに自分が前面に現れます



ボタンをクリックしてるからだと。


>ウィンドウを見つけて最大化させてみたのですが前面表示されません

アクティブにはなってます?

最前面にしたいウィンドウに一旦SetWindowPosでHWND_TOPMOSTをいったんつけて、HWND_NOTOPMOSTにしてあげると前に行くかな?

あとは、ボタンを押してってことなんで、ボタンのクリック時には処理をせずに、PostMessageで自分宛に独自メッセージをポストし、ポストしたメッセージを受け取ってから他アプリの最前面化をしてみるのも効果があるかも。
    • good
    • 0
この回答へのお礼

ありがとうございます

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オーダをいじるのは危険ですね

お礼日時:2004/11/01 01:58

>最大化され前面に一旦はでるもののすぐに自分(動作をさせるプログラム)のWindowの裏に隠れてしまいます



AttachThreadInput()使ってね。

http://mfc.acty-net.ne.jp/ml/mfc/logTop/logAll/0 …

参考URL:http://mfc.acty-net.ne.jp/ml/mfc/logTop/logAll/0 …

この回答への補足

訂正します
メモ帳ではなくhtmlファイルです
ieが閉じているときには
ウィンドウを見つけて最大化するような処理すらしなくても最大化前面表示してくれるのですが
既にieが開いているときには最大化も前面表示もされないので
ウィンドウを見つけて最大化させてみたのですが前面表示されません

補足日時:2004/11/01 00:13
    • good
    • 0
この回答へのお礼

ありがとうございます
したいことは以下の通りです
自分のWindow内のあるボタンをクリックしたら
既存か新規作成のメモ帳に情報を書きこんでそのメモ帳を最大化し前面に表示し
メモ帳を×をクリックして殺したら
自分のウィンドウがフォーカスを持って現れるようにしたいのです
だからHideだとメモ帳を殺した後も消えたままなのでまずいのです

お礼日時:2004/10/31 23:58

ShowWindowのSW_HIDEで消しちゃだめなの?

    • good
    • 0
この回答へのお礼

ありがとうございます
一番上のウィンドウの裏におき一番上のウィンドウが消されたらフォーカスを持った状態で現れるようにしたいのです

お礼日時:2004/10/31 23:49

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