SendKeys関数でのタイミング問題とは?

このQ&Aのポイント
  • SendKeys関数を使用してアンインストール中のウィンドウに対して"{ENTER}"キーを送信してもメッセージが消えない問題が発生しています。
  • アンインストールが終了し、OKボタンが有効になったタイミングで"{ENTER}"キーを送る方法を探しています。
  • GetCodeExitProcssはメッセージが残っている場合には使用できず、良い解決方法を知りたいという質問です。
回答を見る
  • ベストアンサー

Sendkeysのタイミング

2日前に"sendkeysとfindwindow"というタイトルで質問した者です。 まだ解決できなくてまだ困っています。 内容は、  今、MSDEをアンインストールするプログラムを組んでます。  IsUn0411.exeをshell関数の引数にして、起動させると  途中いくつかメッセージが出てきます。  ユーザーには触らせたくないので、  これらのメッセージを全てFindWindowで探して、  SendKeysでキーを飛ばしました。  アンインストール自体は出来るのですが、問題は  最後の”コンピュータからプログラムの削除”という画面です。  これも同じくFindWindowで探すことはできるのですが、  最後SendKeysでキー("{ENTER}")を飛ばしても消えてくれなくて困っています(>_<)。 というもので、なぜメッセージが消えないのか原因が分かりました。 SendKeys関数で"{ENTER}"キーを送信してはいるのですが、 問題はタイミングでした。 ”コンピュータからプログラムの削除”というウィンドウがアンインストール中に すでに出ているため、"{ENTER}"キーを飛ばしてしまいメッセージが消えない・・・ということでした。 そこで、再び質問です。 アンインストールが終了して、OKボタンが有効になったときに"{ENTER}"キーを 送りたいのですが、何か良い方法はありませんか? 私が思いつくのはGetCodeExitProcssしかありません。 これだと完全にexeが終了した場合に使うものなので、 まだメッセージが残っているときは使えませんよね・・・。 では、よろしくお願いします。

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

  • ベストアンサー
回答No.2

ちょっと勘違いしていました。 そうすると、OKボタンのウィンドウハンドルを取得した後で、OKボタンの状態(有効か無効か)を調べ、有効なら SendMessage か SendKeys か、ということになりますね。 有効か無効かは、IsWindowEnabled で判定できると思います。

hemakozo
質問者

お礼

 ありがとうございました!!  ようやくできました(T_T)  私がやった流れとしては、  (1)大本のWindowのプロセスを取得する。  (2)プロセスからOpenprocessでハンドルを取得。  (3)ループの中で、GetWindowで子ウィンドウのハンドルを取る。  (終了条件は、FindWindowで画面があるかどうか)  (4)取ったハンドルのクラス名を取る。  (5)クラス名がボタンだった場合に、IsWindowEnabledで  有効かを見る。  (6)ボタンが有効だった場合にキーと飛ばす。                      です。  API使いまくりで完成しました。  知らないAPIばかりで勉強になりました。  本当にありがとうございました☆

その他の回答 (1)

回答No.1

(1) FindWindow でウィンドウハンドルを取得 (2) GetWindow、GetTopWindow、GetNextWindow のあたり、あるいは EnumChildWindow を使用して、(1) のウィンドウの子ウィンドウの中からOKボタンを探す。 (確か VB5.0 からだったか、VB のユーザー関数のアドレスを API に渡すことができるようになったので、VB でも EnumChildWindow が使用できるような気がします。実際にやったことはないので、よくわからないですけど。) (3) OKボタンが見つかれば SendKeys か SendMessage か何かの処理をする。 ( SendMessage の方が誤動作の可能性がなくて確実だと思います。) のような感じになるのではないでしょうか。

hemakozo
質問者

補足

 回答ありがとうございます。  でも、ちょっとひとつだけひっかがる点が・・・。  (3)の"OKボタンが見つかれば SendKeys かSendMessage か何かの処理をする。"です。  私が制御したい画面は、アンインストール中にすでに  OKボタンが存在しています。  ボタンが無効になっている状態なのです。  だから、ボタンが有効になったときに"{ENTER}"キーを  飛ばしたいと思いまして・・・。  なので、tsukasa-12rさんのおっしゃる方法は有効なのでしょうか??  まだ試していないので、とりあえずはやってみようと思います。  引き続き、おつきあいください。  よろしくお願いします。

関連するQ&A

  • findwindowとsendkeys

     今、MSDEをアンインストールするプログラムを組んでます。  IsUn0411.exeをshell関数の引数にして、起動させると  途中いくつかメッセージが出てきます。  ユーザーには触らせたくないので、  これらのメッセージを全てFindWindowで探して、  SendKeysでキーを飛ばしました。  アンインストール自体は出来るのですが、問題は  最後の”コンピュータからプログラムの削除”という画面です。  これも同じくFindWindowで探すことはできるのですが、  最後SendKeysでキー("{ENTER}")を飛ばしても消えてくれなくて困っています(>_<)。  ネットで色々なページを検索して探してはいるのですが、  参考になるところが見つからなくて・・・。  すみませんが、どなたか良いやり方をご存じの方、教えてください。  よろしくお願いします。

  • SendKeysを使いたい。

    SendKeysを使いたい。 XP-Excel2003です。 Microsoft Bisual Basicのヘルプに記述してある次の構文のうち、 SendKeysが実行されません。 Dim ReturnValue, I ReturnValue = Shell("CALC.EXE", 1) AppActivate ReturnValue For I = 1 To 20 SendKeys I & "{+}", True Next I SendKeys "=", True SendKeys "%{F4}", True F8キーにて、順次実行は出来るのですが、SendKeysが有効になりません。 参照設定の何かにチェックがついていないのだと思います。 その何かを、または別の方法をお教え願います。

  • SendKeys()が一番最後に実行されてしまう。

    SendKeys()が一番最後に実行されてしまう。 コマンドボタン(<input type="button onclick="jidou();">)をクリックすることで、 <form>内の<textarea>に、連続して文字を自動入力させようとしています。 このとき、挿入する文字の途中に、何度かSendKeys("{ENTER}")を挟んで改行をさせているのですが、なぜか、全ての文字がセットされたあとで、最後にまとめて、改行(SendKeys("{ENTER}"))されてしまいます。 解決に行き詰っています。どなたかご存知の方、ご教授願えないでしょうか。 よろしくお願いします。 function jidou() {   :  (文字挿入)   : var wsh = new ActiveXObject("WScript.Shell"); document.getElementById("textarea1").focus(); wsh.SendKeys("{ENTER}"); wsh=null;   :  (文字挿入)   : }

  • ウィンドウを終了させたい・・・

    いつもお世話になっています。 画面遷移時にあるメッセージウィンドウ(別exe)をVBから起動させ、遷移が終わった後にそのexeを終了させるプログラムを作っています。 プログラムの中身としては、 (1) Shell関数でexe(メッセージウィンドウ)を起動 (2) FindWindowで、起動しているexeのハンドルを取得 (3) 取得したハンドルに、SendMessageでexeを閉じるようにする(WM_CLOSEを使用)。 ・・・といったものです。 (1)と(2)はうまくいくのですが、最後のSendMessageがうまくいきません(>_<) 試しに(1)と(2)の後に、Do文の中で [1]SendMessageで起動したexeを終了させるようにする [2]FindWindowをして、ハンドルが0だったら、Exit Doする ・・・ようにプログラムしてみたところ、永久ループになってしまいました・・・。 他にも、SendMessageの代わりにShowWindowを使ってみましたが同じくダメでした・・・(T-T) ネットで調べていますが、他の方法が浮かびません。 どなたか、良い方法をご存じでしょうか?? よろしくお願いします!!

  • VBSのSendKeysでクリックができない

    音声認識アプリケーションからvbsを実行できるのですが、ここで一度だけマウスクリックしたい状況が出てきて困っています。 Dim WSHShell As Object Set WSHShell = CreateObject("Wscript.Shell") WSHShell.AppActivate "操作したいアプリケーション名" WSHShell.SendKeys "{TAB}" 'OK WSHShell.SendKeys "{ENTER}" 'OK WSHShell.SendKeys "{CLICK LEFT, 10, 10}" 'NG TABキーやENTERキーは動作するのですが、3番目のマウスクリックがExceptionといわれエラーになってしまいます。Sendkeysでマウスクリックを送信するにはどうしたらよいのでしょうか?ネットで調べたリファレンスだと上記のような書き方で良さそうなのですが・・・ 音声認識アプリケーションはドラゴンスピーチ11Jで、OSはWin 7 ProとWin 8、どちらも64ビットです。

  • SendKeys "^V", True(貼り付け)のミス

    エクセルシートに設定したリアルタイム関数(楽天マーケットスピード)でデータを取得し、フィルターをかけてメモパッドに表示しています。   エクセルでクリップボードに格納したものを下記のプログラムで[Ctrl]+[V]キーを転送しています。 問題は[Ctrl]+[V]キーがしばしば他のアプリケーションのカーソルに転送されてしまいメモパッドがパスされてしまいます。 AppActivateが効かないのか分かりませんが対策を是非ご教示下さい。 Sub NotePad書き出し() Dim myPath As String dim y as long If nsw <> 0 Then GoTo 即貼り付け'メモ帳起動は一度だけ nsw = 1 myPath = ActiveWorkbook.Path & "\" 'メモ帳を起動する myID = Shell("Notepad.exe", vbNormalFocus) For y = 1 To 3000 'notePadが開く余裕を3秒間取る DoEvents Sleep 1 Next y 即貼り付け: '[ENTER]キーを転送して1行空ける SendKeys "{ENTER}", True 'メモ帳をアクティブにする AppActivate myID '[Ctrl]+[V]キーを転送してコピーした内容を貼り付ける SendKeys "^V", True 'コピーモードを解除する Application.CutCopyMode = False End Sub

  • VBAのSendkeysでShift付の文字になる

    ExcelのVBAでGOM Playerを動かそうと思っています。 動画の途中から時間指定で再生しようと思っていますが、再生時間を指定するための画面を出す文字コード「G」をSendKeysで送るとなぜかShiftキー付の文字コードが送られてしまっているようです。 GOM Playerでは「G」を押すと「移動先の時間を指定」画面が出るのですが、VBAで「G」を送ると、「Shift+G」で表示される「オーディオキャプチャー設定」画面が出てきてしまいます。 VBAではなく手で「G」キーを押すと何の問題もなく表示されます。 具体的に書きますと H列のセルを選ぶとH列に書いてある時間(「0:04」など)のところから再生が始まるプログラムになります。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set 指定セル範囲1 = Range("H2:H132") Set 共有セル範囲1 = Intersect(ActiveCell, 指定セル範囲1) If Not 共有セル範囲1 Is Nothing Then Shell "C:\Program Files (x86)\GRETECH\GomPlayer\GOM.EXE", 1   SendKeys "G"   SendKeys "00:0" & Cells(Rows.Count, 8).Value End If End Sub 「Shell・・」の行はExcelがアクティブの状態からGOM Playerがアクティブの状態にするために入れてあります。 Wait時間を入れてみたり、CRを送ってからGを送ったり 下記のように別のコートで送ってもダメでした。 SendKeys ("G") SendKeys vbKeyG SendKeys 71 また「G」だけではなく「P」を送っても「Shift+P」が送られた動作になってしまいます。 すみませんが、お知恵を貸していただけませんでしょうか。 よろしくお願いします。

  • イベントビューアの操作をしたい

    Windows2000ProSP2でVB6SP5を使用しています。 イベントビューアを起動し、「セキュリティログ」を選択して、「操作(A)」-「ログファイルの名前を付けて保存(A)」、それで名前を付けてCSV形式で保存したいのです。 Shell関数でeventvwr.exeを実行して起動した後、Sendkeysでキー操作をすればいいのかと思ったのですが、 できません。 Shell関数の後でイベントビューアが完全に起動するまで待つ必要があるのではないかと思っています。 実現するには、どのようにすればよいのでしょうか? だめ↓ Shell "eventvwr", vbNormalFocus SendKeys "{DOWN}", Wait SendKeys "{DOWN}", Wait SendKeys "%(a)", Wait

  • VBScript

    下記、プログラムを実行すると、コマンドプロンプトの画面が 消えずに、そのまま残ってしまいます。 どうしたら、画面を消すことができるでしょうか。 お力添えをお願いいたします。 Set WshShell = Wscript.CreateObject("WScript.Shell") Set WshEnv = WshShell.Environment("user") WshEnv("C:\NET\aaa.txt") = "administrator" Wshshell.Run("cmd.exe") WScript.Sleep(500) WshShell.SendKeys("runas /user:administrator " + chr(34) + "xcopy D:\NET\aaa.txt C:\NET\aaa.txt" + chr(34)) WshShell.SendKeys("{Enter}") WScript.Sleep(500) WshShell.AppActivate "C:\WINDOWS\system32\runas.exe" WshShell.SendKeys("XXXXX") WshShell.SendKeys("{Enter}") WScript.Sleep(500)

  • VBA 特定SVRにID,PASSを投入したい

    現在 グループ外のSVRに 下記 を使ってID,PASSを投入しておりますが 成功率があまり高くありません。 この起動EXCEL を保存しますか? 等 違う画面がでてしまいます。 他に良い方法があればご教授お願いいたします。 Dim myid As Long If Application.OperatingSystem = "Windows (32-bit) NT 5.00" Then 'windows2000 myid = Shell("c:\winnt\explorer.exe", vbNormalFocus) Else myid = Shell("c:\windows\explorer.exe", vbNormalFocus) End If If myid <> 0 Then Application.Wait Now() + TimeValue("00:00:02") SendKeys "%d", True SendKeys "\\xxx.xxx.xxx.xxx", True 'IPアドレス SendKeys "{enter}", True Application.Wait Now() + TimeValue("00:00:01") SendKeys "%u", True SendKeys "xxxxxxx", True 'ID SendKeys "{enter}", True SendKeys "%p", True SendKeys "xxxxxxxx", True 'PASSWORD SendKeys "{enter}", True SendKeys "%fc", True Application.EnableEvents = True Else MsgBox "xxxSVR接続に失敗しました。" & vbCrLf & "再度実行して下さい。" End If