アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
WindowsXpにてAppActivate関数をコールすると
実行時エラー5が出てしまいます。
Windows2000では問題なく動作します。
何がいけないのでしょうか?また代用できる関数等ありましたら
お教えいただきたいです。宜しくお願いします。

mspaint = Shell("mspaint.exe " & "d:\sample.bmp", 1)
AppActivate mspaint

環境) WindowsXp VB6(SP5)

A 回答 (5件)

種々試してみました。


結論:
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で定義すること。

理由は専門家に任せるとして。
参考になれば。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/13 14:47

>WinXPではAppActivateが呼べないのでしょうか


WinXPでもAppActivateは使えるはずです。

#4のSUPERGさんを拝借して
mspaint = Shell("mspaint.exe " & "d:\sample.bmp", 1)
StopTime (100) 'アクティブになるまで待つ
AppActivate mspaint
としてみては             
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/13 14:52

>実行時エラー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)
ではどうでしょうか。

この回答への補足

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

補足日時:2005/04/12 18:40
    • good
    • 0

AppActivateの引数は、Shell()が返すタスクIDではなくタイトルバーの文字列ですよ。


例えば電卓なら「電卓」ですね。

ペイントの場合開くアプリケーションによってタイトルバーが変わるので、この場合はShell()やAppActivateを使わずに、OpenProcess(),SetForgroundWindow()やGetWindowThreadProcessId()などのAPIを使ったほうが確実です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/12 11:32

mspaint = Shell("mspaint.exe " & "d:\sample.bmp", vbNormalFocus)



これでは駄目でしょうか?
AppActivate mspaintのコードは不要ではないかと思います(絶対とは云えません)

この回答への補足

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

補足日時:2005/04/12 09:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A