Win95でエディターが最背面になってしまうNo.01596
こに さん 00/11/22 01:02
 
こにです。

おそらく忘れ去られてると思うので、もう一度書きます。
少し症状がわかったので…。

まず、エディターを開いたときにそれがアクティブになっていると100%の確立
で最背面になってしまいます。(Alt+Tabで確認したところ)
次に、たま〜に最前面へ出てくるときはアクティブになっていないのです。(タ
イトルバーが灰色)
そしてまれにノンアクティブかつ際背面ということもあります。

アクティブで勝つ最善面へ出てくることは99%ありません。(正常に動くのはご
くまれです)


で、この問題は僕のパソコンにあるような気がしてきました。
Pentium133+メモリー24MにWin95+IE5.0なので、普通のアプリを動かすだけでも
かなり重たいのです。

やっぱり原因はこのロースペックマシンのせいなのでしょうか?

[ ]
RE:01596 Win95でエディターが最背面になってしまうNo.01598
PATIO さん 00/11/22 09:37
 
>で、この問題は僕のパソコンにあるような気がしてきました。
>Pentium133+メモリー24MにWin95+IE5.0なので、普通のアプリを動かすだけでも
>かなり重たいのです。
>
>やっぱり原因はこのロースペックマシンのせいなのでしょうか?

はなはだ、頼りない話で申し訳ないのですが、
Windowsの場合、これはありえるかなと言うのが私の意見です。
アプリ開発などを行っていますと要求仕様に対してとてつもなく
力不足のハードで動かせなどと言う事がままありまして
そういう状況で動作させるとまず犠牲になりやすいのが
画面の表示周りと言う事が多いです。
事実、ある仕事で重い処理をさせていると画面の更新がされず、
肝心の表示がされないまま、処理が終了して画面も閉じてしまう
とかいった事が良く起きていました。要するに処理が重い場合、
Windowsそのものが、画面の更新処理を後回しにしてしまうのです。
その結果、プログラムを組んだ人間の予想とは反する順番で処理されて
しまい、表示がうまくいかないと言う事も実際にはありえます。
この辺を必ず自分の考えている順番で処理させようとするには、
一旦タイマーを掛けてOSに制御を返し、タイマーイベントで処理の
続きを行うなどと言った普通に考えたらなんでそんな事をと思うような
事を行う必要があります。これが、マルチスレッドだったりすると
さらに話がややこしくなりと言った具合で対処も結構大変です。
オペレーションで逃げられるものならそれで我慢するしかないかも
しれません。

どうでしょうか? >秀まるお様

[ ]
RE:01598 Win95でエディターが最背面になってしまうNo.01618
秀まるお さん 00/11/24 14:34
 
> >で、この問題は僕のパソコンにあるような気がしてきました。
> >Pentium133+メモリー24MにWin95+IE5.0なので、普通のアプリを動かすだけでも
> >かなり重たいのです。

 アクティブになるべきウィンドウがアクティブにならない現象は、Windows98/
Windows2000/WindowsMeで起きる可能性があり、これについてはどうしても直ら
ないケースがあるかもしれないです。

 で、今回の話は、「アクティブになるけども最背面になってしまう」ってこと
だそうで、とりあえずテスト環境を作るのが大変そうなので、背面に行かないよ
うな処理を試しに追加してみます。

 具体的には、SetForegroundWindow()を呼びだすタイミングでついでに

   SetWindowPos( hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );

 を実行するという作戦ですが…。とりあえず入れてみますので次のバージョン
(V0.48)で結果がどうか連絡ください。

 ってことでお願いします。

[ ]
RE:01618 Win95でエディターが最背面になってしまうNo.01659
こに さん 00/11/25 02:00
 
こんにちは、こにです。

>  アクティブになるべきウィンドウがアクティブにならない現象は、Windows98/
> Windows2000/WindowsMeで起きる可能性があり、これについてはどうしても直ら
> ないケースがあるかもしれないです。

僕のWin98SEでは今のところ大丈夫なようです。

>  で、今回の話は、「アクティブになるけども最背面になってしまう」ってこと
> だそうで、とりあえずテスト環境を作るのが大変そうなので、背面に行かないよ
> うな処理を試しに追加してみます。

ありがとうございます。
次のバージョンで確認してみます。

それと、PATIOさんがおっしゃっていた処理が遅いと表示関係が犠牲になるとい
うことですが、鶴亀以外─具体的にはIEやOfficeなどその他のアプリケーション
ではそういったことは起こったことがないです。もちろん、マイクロソフト以外
のアプリでも起こりません。
また、486CPUにWin95を入れて使っていたマシンが2台ありましたが、いずれも一
度も起こったことはありませんでした。

[ ]
RE:01659 Win95でエディターが最背面になってしまうNo.01687
ながさわ さん 00/11/26 00:13
 
こんにちは、長澤です。久しぶりにじっくりウチでネットワーキーング

>>  アクティブになるべきウィンドウがアクティブにならない現象は、Windows98/
>> Windows2000/WindowsMeで起きる可能性があり、これについてはどうしても直ら
>> ないケースがあるかもしれないです。
>
>僕のWin98SEでは今のところ大丈夫なようです。

秀まるおさんが書かれているように、Win98以降のWindows(正確には、Win98以
降のWin32APIを積んだOSで、一部のAPIを利用しているアプリ)で発生する可能
性があります。かなり前から出ているWin32APIの仕様変更による『仕様通りの』
動作です。

>それと、PATIOさんがおっしゃっていた処理が遅いと表示関係が犠牲になるとい
>うことですが、

表示が遅くなって(見えて)、画面の更新がうまくいかないのは、アプリが実行
件をOSに戻さないからで、こにさんの仰るように処理自体の複雑さは問題ではあ
りません。例えばwhile(1)のループの中で、面倒な計算だけを行うような場合で
発生します。こういうことをせざるを得ない場合は、頃合いを見計らって、OSに
制御を戻すようなコードを入れる必要があります。



ちなみにウィンドウが隠れる現象の回避方法は、きちんとMSは公開しています。
秀まるおさんのメールによれば、SetForegroundWindowを呼んでいるので、これ
でほぼ間違いないモノと思われます。

http://www.microsoft.com/JAPAN/support/kb/articles/J044/9/51.htm

では。

INSERT INTO YourMemory
  (Name, EMail, Yahoo_Messenger, WebPage, Message)
    VALUES('Kaoru Nagasawa',
           'curly@ic-net.or.jp',
           'kaoru_nagasawa',
           'http://www.ic-net.or.jp/home/curly/',
           '☆記念スタンプと旅もようの事なら!!');

[ ]
RE:01687 Win95でエディターが最背面になってしまうNo.01691
秀まるお さん 00/11/26 09:14
 
> ちなみにウィンドウが隠れる現象の回避方法は、きちんとMSは公開しています。
> 秀まるおさんのメールによれば、SetForegroundWindowを呼んでいるので、これ
> でほぼ間違いないモノと思われます。
>
> http://www.microsoft.com/JAPAN/support/kb/articles/J044/9/51.htm

 そのような方法があるとは知りませんでした。ただ、レジストリをいじらない
といけないようでは普通に使う訳にはいかなさそうです。

---------
 あ、V0.48で一応対応したことになってますが、もうすぐV0.49アップロードし
ます。>こにさん

[ ]
RE:01618 Win95でエディターが最背面になってしまうNo.01701
こに さん 00/11/26 17:22
 
こんにちは、こにです。

>  ってことでお願いします。

今のところ、大丈夫です。
よ〜く見ていると、ウィンドウが一番後ろから手前へ来るような感じになってい
ます。
ありがとうございました。

[ ]
RE:01691 Win95でエディターが最背面になってしまうNo.01703
こに さん 00/11/26 19:43
 
こにです。

>  あ、V0.48で一応対応したことになってますが、もうすぐV0.49アップロードし
> ます。>こにさん

V0.49でもちゃんと動いていました。
最前列でアクティブではないことがあるのは、やっぱりパソコンのスペックの低
さを理由にしておきます。
一番後ろに回るわけではないので、こっちの方はこれでもいいです。

どうもありがとうございました。

[ ]
RE:01701 Win95でエディターが最背面になってしまうNo.01711
秀まるお さん 00/11/27 08:56
 
> よ〜く見ていると、ウィンドウが一番後ろから手前へ来るような感じになってい
> ます。

 んじゃ、やっぱりSetForegroundWindow()では表に出ないということのようで
…。いったいどうしたことか?。何か常駐ソフトとかマウスユーティリティとか
入れてるようでしたら、一度終了させて様子を見てみて欲しいです。

[ ]
RE:01711 Win95でエディターが最背面になってしまうNo.01712
"M.OBARA" さん 00/11/27 09:22
 
 こんにちは、小原です。

> > よ〜く見ていると、ウィンドウが一番後ろから手前へ来るような感じになってい
> > ます。
>
>  んじゃ、やっぱりSetForegroundWindow()では表に出ないということのようで
> …。いったいどうしたことか?。何か常駐ソフトとかマウスユーティリティとか
> 入れてるようでしたら、一度終了させて様子を見てみて欲しいです。

// どこかからかパクってきたソースです。
// マシン固有なら解決にはなりませんが、どのOSでも以前の SetForegroundWindow
() と
// 同じような動きにしたい場合、以下の関数で対応できるかもしれません。
void CXxx::Xxx( HWND hwnd )
{
    DWORD dwTarget_id, dwActive_id;

    dwTarget_id = ::GetWindowThreadProcessId( hwnd, NULL );
    if( dwTarget_id == 0 ) {
        return;
    }

    dwActive_id = ::GetWindowThreadProcessId( ::GetForegroundWindow(), NULL );
    if( dwActive_id == 0 ) {
        return;
    }

    if( ::AttachThreadInput( dwTarget_id, dwActive_id, TRUE ) == FALSE ) {
        return;
    }

    if( ::SetForegroundWindow( hwnd ) == FALSE ) {
        return;
    }

    ::AttachThreadInput( dwTarget_id, dwActive_id, FALSE );
}

[ ]
RE:01712 Win95でエディターが最背面になってしまうNo.01726
秀まるお さん 00/11/27 14:53
 
 これはこれは、貴重な情報ありがとうございます。さっそくこの作戦使わせて
いただきます。(秀丸でも)

[ ]
RE:01703 Win95でエディターが最背面になってしまうNo.02016
秀まるお さん 00/12/07 11:50
 
 古い話になりますが、実はV0.53にて、またまたエディタウィンドウを表に出す処
理を修正しています。

 たしか、「一度裏に表示されてから表に出てくるように見える」というような話が
あったと思うので、最初からウィンドウを最前面に出すように修正しました。

[ ]
RE:02016 Win95でエディターが最背面になってしまうNo.02064
こに さん 00/12/07 20:09
 
こにです。

>  古い話になりますが、実はV0.53にて、またまたエディタウィンドウを表に出す処
> 理を修正しています。
>
>  たしか、「一度裏に表示されてから表に出てくるように見える」というような話が
> あったと思うので、最初からウィンドウを最前面に出すように修正しました。

……そうだったのですか。
実は、V0.53にアップしたら2回だけ前面に出てこなかったときが合ったのです。

一回目はCtrl+Rで返信メールを書こうとしたとき。このときはメインウィンドウ
を最大化していたのでアクティブだったかどうかは確認できませんでした。

2回目は、エディターを前面に出していてAlt+Tabでメインウィンドウに戻ろうと
した時に起きました。メインウィンドウ・エディターともバックグラウンドにな
ってしまい(他にタスクバー常駐ソフト以外は動いていなかったです)Alt+Tab
の切り替えがきかなくなってしまった(はず)です。

三回目を見たら報告しようと思っていたのですが、処理を変えたとのことですか
ら報告します。

[ ]
RE:02064 Win95でエディターが最背面になってしまうNo.02115
秀まるお さん 00/12/08 22:30
 
 SetWindowPosの時にHWND_TOPを指定しているから必ず最前面に出るはずなんですけ
ど…。どうしたことやら?

 一応、SetForegroundWindow()も追加してみます。

[ ]