何かタスクバー上でボタンがペカペカするよ…
リモートデバッグをしているのだが…
アプリケーションが起動した時に操作ができな時がある…。
このとき、タスクバー上でボタンがペカペカする…。
何が嫌って、アトランダムに発生する操作…。
なので調べる事にした…。
実は、以前テキストエディタで起こって致命的に悩まされた。
沢山ウインドウを開いて切り替えているのに
キチンと切り替わらないのは、激!苦痛だ!
なのでその対策に何か無いか、探して見つけたのがこれ!
『ぴかぴかあしすと』!
『ソフト詳細説明』で
>・一度使ったら手放せない... と思います。たぶん
ってあるが、それ以来使い続けています…。
…
…
…
あれ?
…
…
…
もしかして、以前のリモートPCで不具合が起きなかったのは…
これのせい?
…
いま、デバッグに使っているリモートPCには、入っていない…。
…
今、気が付いた衝撃の事実…!(汗)
だから悩まされなかったのか!
…
横道にそれた…。
さて、何が悪いのか?
クリックをすれば、操作ができるようになる…。
アクティブでないのか調べるとアクティブ…。
ウインドウメッセージを全て拾ってみるが
特におかしな所が見つからない…。
でも、何らかの方法で検出できるはず!
で、色々調べてやってみた。
そしたら『hWnd != GetForegroundWindow( )』の
時に発生しているのが分かった。
何故そうなるのかは、置いといて…
サクッと『SetForegroundWindow( hWnd );』を実行すればOK?(笑)
やってみた。
駄目だった…。
『SetForegroundWindow( hWnd );』がエラーを返す…。
正常に動作してくれない…。
困った…。
…
調べてみると
『SetForegroundWindow』の説明にこうある。
>この旧バージョンからの変更により、アプリケーションは、
>ユーザーが他のウィンドウで作業しているときに強制的に
>フォアグラウンドウィンドウを設定することはできなくなりました。
まあ、98から2Kになったときに制限を加えたらしい。
何らかの入力最中にウインドウが切り替わると
入力処理が中断されるので、それを防ぐためにわざと
切り替わらないようにしてあるようだ。
『IME』などの文字入力処理との兼ね合いなのか?
でも、切り替わらない方が不便だと思うのだが…
実際不便だったし…。
…
兎も角、こっちの話は…
フォアグランドを掴んで放さないウインドウから
フォアグランドを手放させる必要があるって事。
で、色々探して拾ってみた。
でも、『ぴかぴかあしすと』に付いていた
ソースが一番すっきりしていた。
灯台下暗し…。(汗)
で、対策はこんな感じ。
hWnd = CreateWindow( … );
ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );
// もしフォアグランドにならない場合の処理
while( hWnd != GetForegroundWindow( ) )
{
DWORD ThreadID, ForeThreadID;
ThreadID = GetCurrentThreadId( );
ForeThreadID = GetWindowThreadProcessId( GetForegroundWindow( ), NULL );
AttachThreadInput( ThreadID, ForeThreadID, TRUE );
SetWindowPos( hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
SetForegroundWindow( hWnd );
AttachThreadInput( ThreadID, ForeThreadID, FALSE );
}
この処理は、『AttachThreadInput』を使用して
「これで君も僕も一心同体。だから君の
フォアグランドを僕も使うよ♪」
って事らしい。
でも、意外なのが『SetForegroundWindow』を実行しても
ウインドウがトップに来ない事。
なので『SetWindowPos』で切り替えないといけない。
今更だが、セーフティを組み込んでみます…。(汗)
PS.
リモートPCには、常駐ソフトを入れないようにしよう…。(汗)
| 固定リンク
コメント