• ベストアンサー

WindowsXpでAppActivate

お世話になります。 WindowsXpにてAppActivate関数をコールすると 実行時エラー5が出てしまいます。 Windows2000では問題なく動作します。 何がいけないのでしょうか?また代用できる関数等ありましたら お教えいただきたいです。宜しくお願いします。 mspaint = Shell("mspaint.exe " & "d:\sample.bmp", 1) AppActivate mspaint 環境) WindowsXp VB6(SP5)

質問者が選んだベストアンサー

  • ベストアンサー
  • SUPERS
  • ベストアンサー率42% (26/61)
回答No.4

種々試してみました。 結論: mspaint = Shell("mspaint.exe " & "d:\sample.bmp", 1) この間、1秒以上空ける AppActivate mspaint でした。 IDもタイトル行の文字列も試してみました。 が、いずれも実行OKでした。 1) AppActivate を独立したボタンに定義しshell文が実行されてから数秒経過してボタンをクリックする。 2) 一度だけ起動のTimerイベントを使い、そのTimer内部で Disabledにし、AppActivateを実行。 ちなみに タイトル文字列を利用する場合 AppActivate "sample.bmp - ペイント" でOKです。 IDを使う場合(mspaint)、Formのgeneralでdim定義もしくはglobalで定義すること。 理由は専門家に任せるとして。 参考になれば。

geso775
質問者

お礼

できました!! mspaintを実行してから、waitが必要なのですね。 デバッグ時に"1644"のようなIDが取得できたので、waitは考えませんでした。 その後にAPI32実装したsendkeyを実行するのですが、こちらはwaitかけてたのですが。。 SUPERS様、どうもありがとう御座いました。

その他の回答 (4)

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.5

>WinXPではAppActivateが呼べないのでしょうか WinXPでもAppActivateは使えるはずです。 #4のSUPERGさんを拝借して mspaint = Shell("mspaint.exe " & "d:\sample.bmp", 1) StopTime (100) 'アクティブになるまで待つ AppActivate mspaint としてみては             

geso775
質問者

お礼

O_cyan様、有難うございます。 #4様にアドバイスいただき、解決いたしました。 Stoptime(100)はVBの有名サイトサンプルですね。 http://www.bcap.co.jp/hanafusa/VBHLP/keybdeve.htm また、宜しくお願いします。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.3

>実行時エラー5が出てしまいます 実行時エラー5はプロシジャーや引数の不正ですよね。 実行中のプログラムを識別するタスクIDをAppActivate ステートメントで使用するですよね。 Dim Ret As Long Ret = Shell("C:\Program Files\Accessories\mspaint.exe" & "d:\sample.bmp", 1) AppActivate Ret か Dim Ret As Long Dim MyFile As String MyFile = Chr$(34) & "D:\sample.bmp" & Chr$(34) Ret = Shell("C:\Program Files\Accessories\mspaint.exe" & MyFile, 1) ではどうでしょうか。

geso775
質問者

補足

お返事有難うございます。 アドバイスに習ってプロシージャの引数を疑ってみたのですが、結果変わらずでした。 WinXPではAppActivateが呼べないのでしょうか、疑問です。。 #2さんの示されたAPI32でコードを組もうとしているのですが、いまいち使い方わからず 実装できてませんといったところです・・ ご助言いただけることがありましたら、又よろしくお願いします。

  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.2

AppActivateの引数は、Shell()が返すタスクIDではなくタイトルバーの文字列ですよ。 例えば電卓なら「電卓」ですね。 ペイントの場合開くアプリケーションによってタイトルバーが変わるので、この場合はShell()やAppActivateを使わずに、OpenProcess(),SetForgroundWindow()やGetWindowThreadProcessId()などのAPIを使ったほうが確実です。

geso775
質問者

お礼

おっしゃる通り、標準は文字列を渡すようですが、MSDNヘルプで、Shellが返すIDを引数にすることもできるみたいです。 piyo様の示されたAPIを調べようと思います。ありがとうございました。

  • kiki_s
  • ベストアンサー率59% (147/248)
回答No.1

mspaint = Shell("mspaint.exe " & "d:\sample.bmp", vbNormalFocus) これでは駄目でしょうか? AppActivate mspaintのコードは不要ではないかと思います(絶対とは云えません)

geso775
質問者

補足

回答有難うございます。 >mspaint = Shell("mspaint.exe " & "d:\sample.bmp", 1) やってみましたが、だめでした。。Shellの引数"1"はvbNormalFocusを示すです。。 ちなみに、mspaintにフォーカスをあてるのはこの後sendkeysを実行します。