プロが教える店舗&オフィスのセキュリティ対策術

sendkeysで、他のアプリケーションにキー操作を送りたいのですが、チェックボックスをオンにするときの【スペースキーを押す】という操作がうまくいきません。
sendkeys "{SPACE}",true ではだめなのでしょうか?
よろしくお願いします。

A 回答 (3件)

こんにちは。



> キー操作を送りたいのは、ある大手メーカー製のERPシステムです

そうですか....SendKeys は、

 1. ウインドウがアクティブでないとダメ

   PC によって処理速度が異なります。例えば、ウインドウが開い
   てアクティブになるまでの速さ。開発時のPC は 1 秒待ってから
   SendKeys ..で良かったはずなのに、別 PC では 5 秒待たなけれ
   ばならなかった...ということですね。SendKeys でキー送信して
   もウインドウが開いてないんです。一例です。

   つまり、開発時の PC と同様の動作は別 PC で保証されません。

 2. 2000系OS で Numlock が解除される(今はどうなんだろ?)

などの問題があって、限られた用途「自分しか使わない」のであれば良い
のですが、基本的にオススメできません。SendKeys は最後の手段として
位置づけるのが良いと私は思います。

 # 困ったときの SendKeys でもあるんですけどね(´(・)`)

Excel VBA を使う理由が特になければ、Wendy02 さんオススメの UWSC が
私も良いと思います。

どうしても VBA で...というのであれば、PostMessage などの API を
使うことを考えてみて下さい。この場合、ウインドウがアクティブなのか
どうかは関係なく他アプリケーションを操作可能です。

以下はメモ帳(WinXP付属)を VBA で操作するテストコードです。要は、
ハンドルさえ拾えれば大抵のことは SendKeys でなくとも可能です。
ご参考までに...

Option Explicit

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
   ByVal lpClassName As String, _
   ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _
   ByVal hWnd1 As Long, _
   ByVal hWnd2 As Long, _
   ByVal lpsz1 As String, _
   ByVal lpsz2 As String) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" ( _
   ByVal hWnd As Long, _
   ByVal wMsg As Long, _
   ByVal wParam As Long, _
   ByVal lParam As Long) As Long
Private Declare Sub Sleep Lib "kernel32.dll" ( _
   ByVal dwMilliseconds As Long)

Private Const WM_CHAR As Long = &H102
Private Const WM_COMMAND As Long = &H111
Private Const WM_CLOSE As Long = &H10
Private Const BM_CLICK As Long = &HF5&
Private Const BM_SETCHECK = &HF1
Private Const BST_CHECKED As Long = &H1
Private Const BST_UNCHECKED As Long = &H0

Public Sub Sample()
  
  Dim hWnd   As Long
  Dim hWnd_C  As Long
  Dim hWnd2  As Long
  Dim hWnd2_C As Long
  Dim strtSend As String
  Dim i    As Long
    
  ' クラス名とウインドウ構成は VB 付属の Spy++ で調べました。
  ' VECTOR などにも似た様なフリーツールは在ります

  ' メモ帳起動
  MsgBox "他アプリケーション制御のサンプルです。メモ帳を起動します"
  Application.Visible = False
  Shell "Notepad.exe", vbNormalNoFocus
  
  ' メモ帳のウインドウハンドルを取得
  hWnd = FindWindow("Notepad", "無題 - メモ帳")
  ' メモ帳の文字入力部のコントロールハンドルを取得
  hWnd_C = FindWindowEx(hWnd, 0&, "Edit", vbNullString)
  
  ' 文字列送信テスト
  strtSend = "教えて!Goo."
  MsgBox "メモ帳に文字列「" & strtSend & "」を送信します"
  For i = 1 To Len(strtSend)
    Call PostMessage(hWnd_C, WM_CHAR, Asc(Mid$(strtSend, i, 1)), 0&)
  Next i
  
  ' メモ帳のメニューをクリックし「検索」ダイアログを表示
  ' 「検索」のコマンドID 21 はリソースハッカーを使って調べました
  
  MsgBox "続いて検索ダイアログを表示します", vbInformation
  Call PostMessage(hWnd, WM_COMMAND, 21&, 0&)
  ' ダイアログが開くのを待つ(適当 500ミリ秒)
  Sleep 500&
  
  ' 検索ダイアログウインドウハンドル
  hWnd2 = FindWindow("#32770", "検索")
  ' チェックボックスのハンドル取得
  hWnd2_C = FindWindowEx(hWnd2, 0&, "Button", "大文字と小文字を区別する(&C)")
    
  MsgBox "チェックボックスを ON にします"
  Call PostMessage(hWnd2_C, BM_SETCHECK, BST_CHECKED, 0&)
  
  MsgBox "チェックボックスを OFF にします"
  Call PostMessage(hWnd2_C, BM_SETCHECK, BST_UNCHECKED, 0&)
  
  MsgBox "検索文字を送信してみます"
  hWnd2_C = FindWindowEx(hWnd2, 0&, "Edit", vbNullString)
  For i = 1 To Len(strtSend)
    Call PostMessage(hWnd2_C, WM_CHAR, Asc(Mid$(strtSend, i, 1)), 0&)
  Next i
  
  MsgBox "[キャンセル]ボタンをクリックします"
  hWnd2_C = FindWindowEx(hWnd2, 0&, "Button", "キャンセル")
  Call PostMessage(hWnd2_C, BM_CLICK, 0&, 0&)
  
  MsgBox " メモ帳を閉じます.[保存しますか?]ダイアログは手動で閉じて下さい."
  Call PostMessage(hWnd, WM_CLOSE, 0&, 0&)

  Application.Visible = True

End Sub
    • good
    • 1

こんにちは。



Excel VBAは、ほとんどExcel内でしか使えません。

簡単な方法では、こんな風にすれば、動くかとは思います。

 Application.Wait Now + TimeValue("00:00:02")
 '待ち時間を置くのは、手動で、Activeアプリケーションを返るためです。
 'Activeアプリケーションを換えるには、Win32 APIや、WMIを使用します。
 CreateObject("Wscript.Shell").SendKeys " "
'IMEのON/Offの状態に影響を受けます。

ただ、もしも、システムパッケージの前に、Excelを初動させ、プロセスを残したまま稼動させるのは、やめたほうがよいですね。何が起こるか安心できません。Excelは、一定のメモリを占有し、また、自動保存などもあります(切ればよいのですが)。

簡易自動システムをお考えになるなら、今は有名になった、「UWSC」って本まで出ているスクリプト言語があります。画面からコマンドを与えるようなつくりになっていますね。使い方は簡単で、記録マクロも出来ますし、コーディングも出来ます。(最初知った時、作者は日本人ではないと思いました。)
このツールの記録マクロでの問題点は、画面のそれぞれのコントロールの位置が重要になるので、画面が動くと、コントロールのクリック等が外れてしまいます。それを避けるには、やはりコーディングによる方法が必要です。これで、1昼夜で、同じ作業を繰り返すことも可能です。

うみうみ屋さん
http://www.h7.dion.ne.jp/~umiumi/
    • good
    • 0

こんにちは。

KenKen_SP です。

> sendkeys "{SPACE}",true

Sendkeys " ",True とか(空白スペースをそのまま送信です)

> 他のアプリケーションにキー操作を送りたい...

Sendkeys ですか...ちなみにどのアプリケーションなのでしょうか?

この回答への補足

KenKen_SPさん、ありがとうございます。
キー操作を送りたいのは、ある大手メーカー製のERPシステムです。
今回、システムを起動し、メニュー画面からCtrl+Fでセッション検索をさせたいと思っているのですが、検索ダイアログボックスの表示まではいけるのに、条件設定のチェックボックスへのOn/Off切り替えがうまくできなくて困っています。基本的にWindows/Unix環境では他のアプリと同じキー操作が使えるようなのですが(実際通常操作だとスペースキーでのOn/Off切り替えも可能)、VBAでは限界ということでしょうか・・・?

補足日時:2006/08/10 08:05
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


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