出したいURLを指定してSHELLEXECUTEで目的のサイトを表示しています。しかし呼び出したアプリが画面の前面に表示されないでそれまで起動していたアプリの下に隠れてしまいます。挙動を調べてみると始めて呼び出すURLは前面に出ますが2度目からは裏に隠れるという傾向がみられます。
原因としてクリックした際発生しするMouseUpなどのイベントによりFocusが移動してしまうのではないかと考えてクリックした瞬間にEnabled=Falseなどにすることを試しましたがどうも上手くいきません。宜しくご教示ください。 なお環境はWinXPとVB6です。
(場合によっては若干の間をおいて)自分を背面に移動させるとか。
(若干の間をおいて)相手のWindow Handle取得して、相手を自分の前面に移動させるとか。
SHELLEXECUTEでなく、InternetExplorerオブジェクト使っているのなら、
「間をおく」のでなく表示完了のイベント拾って移動させるという手もありますが。
Say様、ご回答をありがとうございます。
ご教示いただいた案につき仕様を検討してみましたが、現在のアプリは親アプリからShellで起動させて前面に表示させている、WEBブラウザは特定できない、などの理由からアドバイスの「相手のWindow Handle取得して、相手を自分の前面に移動させる」という方法しかないかと考えました。
力がありませんのでWindowHandleの取得の方法、取得したらどのようにして新たに起動したブラウザを前面に移動するか、などが具体的にわかりませんのでこれから過去ログなどを調べてみますのでまたアドバイスをください。お礼まで。
ShellExecuteはWindowHandleを返しませんので、
EnumWindowsで列挙して、
GetWindowLongでインスタンスハンドルを取得して
ShellExecuteの戻り値と比較することになるかと。
あるいは、Windowを特定するのなら、
Set objShell = CreateObject("Shell.Application")
For Each objWindow In objShell.Windows
If TypeName(objWindow.Document) = "HTMLDocument" Then
If objWindow.Document.Title = "********" Then
みたいな方法もアリかと。
場合によってはWSH使って、WScript.Shell.Run で関連付け実行して
WScript.Shell.AppActivate でActiveにする、というのもアリかも。
関連付け起動ではなく、アプリケーションを指定すれば簡単なんですが... (^-^;)
Say様、じゃんぬねっと様、アドバイスをありがとうございました。アドバイスいただいたWindowHandleとかのキーワードを頼りに一つづつ調べて正攻法で解決しようと時間を掛けましたが見よう見まね派の自分にはなかなか次に進まないdいました。しかし同じコマンドで今まで上手くいっているのに何故か、ということを追求していきましたらShellExecuteの直前に他のForm(モーダル)をUnloadするイベントがまだ残っていて発生していることがわかりました。即ちモーダルから抜け出してShellExecute命令を出すラインに戻っても実はまだUnload(?)の処理が完全に完了していないようです。DoEvents入りのループで0.1秒間を置いてからShellをかけることにより目的は達成できました。力不足でこのような簡便法でまがりなりにでも動きましたが今後勉強して正攻法で処理できる力を身につけようと思いました。
じゃんぬねっと様のサイトを拝見させていただきましたが分かりやすいサンプルが沢山ありましたので見よう見まね派には今後大いに助けをお借りできそうです。ありがとうございました。
| ツイート |
|