■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#10-5
自分を必ずアクティブウインドウにする方法
Win2000(Sp2) + VB6(Sp5)という環境で
自プログラム(EXE)を強制的にアクティブウインドウにする方法を探しています。

フォームをクリックしてもらったり、
プログラム内部でwindowState値を変更したりすると
アクティブウインドウにはなるのですが、
もう少し、スマートなやりかたをご存知でしたらお願いいたします。
#43-4
RE#10:自分を必ずアクティブウインドウにする方法
> フォームをクリックしてもらったり、
> プログラム内部でwindowState値を変更したりすると
> アクティブウインドウにはなるのですが、
> もう少し、スマートなやりかたをご存知でしたらお願いいたします。

方法として、スマートなものなら、SetForegroundWindow という API で、
アクティブに出来ます。
表示としてスマートなら、最前面ウインドウにする事で、常に手前に表示さ
れるようになります。これには、SetWindowPos という API を使います。
#インターネットを検索して貰えれば、サンプルはたくさん見つかります。(^_^)/
#43-1
RE#10:自分を必ずアクティブウインドウにする方法
> フォームをクリックしてもらったり、
> プログラム内部でwindowState値を変更したりすると
> アクティブウインドウにはなるのですが、
> もう少し、スマートなやりかたをご存知でしたらお願いいたします。

方法として、スマートなものなら、SetForegroundWindow という API で、
アクティブに出来ます。
表示としてスマートなら、最前面ウインドウにする事で、常に手前に表示さ
れるようになります。これには、SetWindowPos という API を使います。
#インターネットを検索して貰えれば、サンプルはたくさん見つかります。(^_^)/
#87-2
RE#43:自分を必ずアクティブウインドウにする方法
藤代千尋 さんご回答ありがとうございます。

> 方法として、スマートなものなら、SetForegroundWindow という API で、
> アクティブに出来ます。
> 表示としてスマートなら、最前面ウインドウにする事で、常に手前に表示さ
> れるようになります。これには、SetWindowPos という API を使います。
> #インターネットを検索して貰えれば、サンプルはたくさん見つかります。(^_^)/


実は、すでに試してました。(^^;
茜も最初は、これでアクティブウインドウになると信じてたのですが。

SetForegroundWindowは最前面に来るのは来るのですが・・・。
「必ずアクティブウインドウに」はなりませんでした。

(FormLoadに故意に5秒ほどウエイトをかけ、Activateで上記APIを発行するような
 プログラムをテストで作りました。exeにコンパイル後、エクスプローラから
 起動させ、画面が出るまでにエクスプローラをクリックしたりすると、
 テストプログラムは最前面には来ますが、アクティブウインドウではありません。
 テストプログラムにテキストボックスを張っておくとよくわかります。
 キーストロークをテストプログラムは受け取ってくれません。)

そんなわけで、たまたま「そうしたい」プログラムはフルスクリーンサイズだったので・・・。
1.ダミーのフォームをフルスクリーンに表示しておく
2.本当の表示フォームのActivateに、フォームサイズを変更する記述を書いておく。
3.ダミーを消す。

という、とりあえずフォームサイズのちらちらをダミーで隠し、
かつ、アクティブウインドウになる、というプログラムになってます(苦しいな〜)
#88-3
RE#87:自分を必ずアクティブウインドウにする方法
> 実は、すでに試してました。(^^;
> 茜も最初は、これでアクティブウインドウになると信じてたのですが。
> 
> SetForegroundWindowは最前面に来るのは来るのですが・・・。
> 「必ずアクティブウインドウに」はなりませんでした。
> 
> (FormLoadに故意に5秒ほどウエイトをかけ、Activateで上記APIを発行するような
>  プログラムをテストで作りました。exeにコンパイル後、エクスプローラから
>  起動させ、画面が出るまでにエクスプローラをクリックしたりすると、
>  テストプログラムは最前面には来ますが、アクティブウインドウではありません。
>  テストプログラムにテキストボックスを張っておくとよくわかります。
>  キーストロークをテストプログラムは受け取ってくれません。)
> 
Windows 2000では(実際にはWindows98から)フォアグラウンドウィンドウの設定に
システム(OS)レベルで仕様変更が行われていますのでSetForegroundWindow APIで
必ずフォアグラウンドウィンドウになるわけではありません。

SetForegroundWindow
http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_setforegroundwindow.htm
や
Microsoft Windows 2000 アプリケーションの互換性
の
Windows 2000 の互換性の問題
http://www.microsoft.com/JAPAN/developer/windows2000/techart/win2000appcomp.asp
の説明をお読み下さい。

回避する方法としては、
一番簡単なのは、レジストリを書き換えることです。
レジストリを書き換えると NT4.0と同じ様に動作させることができます。
レジストリの書き換え方は
http://homepage2.nifty.com/winfaq/w2k/hints.html
の「ウィンドウがフォアグラウンドに来ないで、タスクバー上で点滅するのですが」
の項目をお読み下さい。
# 個人的には1プログラムが勝手に(ユーザに知らせることなくシステムに関連する部分の)
# レジストリを書き換えるのは好ましくないと思うけど
SystemParametersInfo APIでプログラム内から変更する方法もありかも…

レジストリを書き換えたくないのであれば、
1)現在のフォアグラウンドウィンドウを取得して(GetForegroundWindow API)
2)取得したWindowHandleのスレッドを取得して(GetWindowThreadProcessId API)
3)自分のスレッド(App.ThreadID)を取得したスレッドにアッタチしてから(AttachThreadInput API)
SetForegroundWindow APIを呼び出すことで回避できたと思う。
ただこの方法はWindows98の回避方法だっだと記憶しているのでWindows2000でも
有効なのは分かりません。

力ずくでいくのなら起動直後にBlockInput APIでキーボード/マウス入力をブロックし
操作出来ないようにしてしまう。
画面が表示されたらブロックを解除する。
#87-0
RE#43:自分を必ずアクティブウインドウにする方法
藤代千尋 さんご回答ありがとうございます。

> 方法として、スマートなものなら、SetForegroundWindow という API で、
> アクティブに出来ます。
> 表示としてスマートなら、最前面ウインドウにする事で、常に手前に表示さ
> れるようになります。これには、SetWindowPos という API を使います。
> #インターネットを検索して貰えれば、サンプルはたくさん見つかります。(^_^)/


実は、すでに試してました。(^^;
茜も最初は、これでアクティブウインドウになると信じてたのですが。

SetForegroundWindowは最前面に来るのは来るのですが・・・。
「必ずアクティブウインドウに」はなりませんでした。

(FormLoadに故意に5秒ほどウエイトをかけ、Activateで上記APIを発行するような
 プログラムをテストで作りました。exeにコンパイル後、エクスプローラから
 起動させ、画面が出るまでにエクスプローラをクリックしたりすると、
 テストプログラムは最前面には来ますが、アクティブウインドウではありません。
 テストプログラムにテキストボックスを張っておくとよくわかります。
 キーストロークをテストプログラムは受け取ってくれません。)

そんなわけで、たまたま「そうしたい」プログラムはフルスクリーンサイズだったので・・・。
1.ダミーのフォームをフルスクリーンに表示しておく
2.本当の表示フォームのActivateに、フォームサイズを変更する記述を書いておく。
3.ダミーを消す。

という、とりあえずフォームサイズのちらちらをダミーで隠し、
かつ、アクティブウインドウになる、というプログラムになってます(苦しいな〜)
#88-0
RE#87:自分を必ずアクティブウインドウにする方法
> 実は、すでに試してました。(^^;
> 茜も最初は、これでアクティブウインドウになると信じてたのですが。
> 
> SetForegroundWindowは最前面に来るのは来るのですが・・・。
> 「必ずアクティブウインドウに」はなりませんでした。
> 
> (FormLoadに故意に5秒ほどウエイトをかけ、Activateで上記APIを発行するような
>  プログラムをテストで作りました。exeにコンパイル後、エクスプローラから
>  起動させ、画面が出るまでにエクスプローラをクリックしたりすると、
>  テストプログラムは最前面には来ますが、アクティブウインドウではありません。
>  テストプログラムにテキストボックスを張っておくとよくわかります。
>  キーストロークをテストプログラムは受け取ってくれません。)
> 
Windows 2000では(実際にはWindows98から)フォアグラウンドウィンドウの設定に
システム(OS)レベルで仕様変更が行われていますのでSetForegroundWindow APIで
必ずフォアグラウンドウィンドウになるわけではありません。

SetForegroundWindow
http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_setforegroundwindow.htm
や
Microsoft Windows 2000 アプリケーションの互換性
の
Windows 2000 の互換性の問題
http://www.microsoft.com/JAPAN/developer/windows2000/techart/win2000appcomp.asp
の説明をお読み下さい。

回避する方法としては、
一番簡単なのは、レジストリを書き換えることです。
レジストリを書き換えると NT4.0と同じ様に動作させることができます。
レジストリの書き換え方は
http://homepage2.nifty.com/winfaq/w2k/hints.html
の「ウィンドウがフォアグラウンドに来ないで、タスクバー上で点滅するのですが」
の項目をお読み下さい。
# 個人的には1プログラムが勝手に(ユーザに知らせることなくシステムに関連する部分の)
# レジストリを書き換えるのは好ましくないと思うけど
SystemParametersInfo APIでプログラム内から変更する方法もありかも…

レジストリを書き換えたくないのであれば、
1)現在のフォアグラウンドウィンドウを取得して(GetForegroundWindow API)
2)取得したWindowHandleのスレッドを取得して(GetWindowThreadProcessId API)
3)自分のスレッド(App.ThreadID)を取得したスレッドにアッタチしてから(AttachThreadInput API)
SetForegroundWindow APIを呼び出すことで回避できたと思う。
ただこの方法はWindows98の回避方法だっだと記憶しているのでWindows2000でも
有効なのは分かりません。

力ずくでいくのなら起動直後にBlockInput APIでキーボード/マウス入力をブロックし
操作出来ないようにしてしまう。
画面が表示されたらブロックを解除する。
#106-3
RE#88:自分を必ずアクティブウインドウにする方法
JIさんありがとうございます。

> レジストリを書き換えたくないのであれば、
> 1)現在のフォアグラウンドウィンドウを取得して(GetForegroundWindow API)
> 2)取得したWindowHandleのスレッドを取得して(GetWindowThreadProcessId API)
> 3)自分のスレッド(App.ThreadID)を取得したスレッドにアッタチしてから(AttachThreadInput API)
> SetForegroundWindow APIを呼び出すことで回避できたと思う。
> ただこの方法はWindows98の回避方法だっだと記憶しているのでWindows2000でも
> 有効なのは分かりません。

上記の方法は2000でも有効でした。
目的フォームが最前面に表示され、キーストロークも受け取れました。

ありがとうございます!

#106-0
RE#88:自分を必ずアクティブウインドウにする方法
JIさんありがとうございます。

> レジストリを書き換えたくないのであれば、
> 1)現在のフォアグラウンドウィンドウを取得して(GetForegroundWindow API)
> 2)取得したWindowHandleのスレッドを取得して(GetWindowThreadProcessId API)
> 3)自分のスレッド(App.ThreadID)を取得したスレッドにアッタチしてから(AttachThreadInput API)
> SetForegroundWindow APIを呼び出すことで回避できたと思う。
> ただこの方法はWindows98の回避方法だっだと記憶しているのでWindows2000でも
> 有効なのは分かりません。

上記の方法は2000でも有効でした。
目的フォームが最前面に表示され、キーストロークも受け取れました。

ありがとうございます!
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)