[[20120806220210]] 『変数で入力をしたいと思います。』(enomoto) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『変数で入力をしたいと思います。』(enomoto)

 keybd_eventにつきまして、

 Public Const VK_1 = &H31

 まず、このような感じで  1863  と 

 打つには、一文字ずつ keyDown keyup しないといけないのでしょうか?

 keybd_event(○○, 0, 0, 0)

       ↑ この部分は変数を入れることは可能でしょうか?

 質問の仕方がおかしいのですが、どうかよろしくお願いします。 


 まずは用途を説明されてはどうでしょうか。
 簡易に行いたい向きには SendKeys があります。

 keybd_event はそれより低位のAPIですから、KeyUp KeyDown まで指定しての制御が必要です。

 肝心の質問への回答ですが、もちろん変数で使用可能です。
 (Mook)


 For i = 1 To UBound(fncV)

    Sleep 400
    WshShell.SendKeys "(" & fncV(i, 1) & ")", True

    Sleep 400
    WshShell.SendKeys ("{ENTER}"), True

    Sleep 400    
    WshShell.SendKeys "(" & fncV(i, 2) & ")", True

    Sleep 400
    WshShell.SendKeys ("{ENTER}"), True

 Next i

 Mookさん お世話になります。
 excelで作ったデータを他のプログラムに転記しています。
 現在は、上記のようにしております。
 これも最初は、何もつけていなかったのですが、
 CreateObject("WScript.Shell")
 これをsetすると精度が上がると何処かのサイトに書いてあり、
 理由もわからず、つけています。

 そのうちにnumlockがおかしくなってきました。
 プログラムを終了すると、numlockがoffになっているのです。

 そこでまた調べて、

 Private Sub numlock_lookup()

 If (GetKeyState(VK_NUMLOCK) And 1) <> 0 Then
     'Debug.Print "VK_NUMLOCK ON"
 Else
     'Debug.Print "VK_NUMLOCK OFF"
     Call numlock_onoff
 End If

 End Sub

 Private Sub numlock_onoff()

 'Dim WshShell
 'Set WshShell = CreateObject("WScript.Shell")

 'Sleep 500
 'WshShell.SendKeys "{NUMLOCK}"

 'Set WshShell = Nothing

 Call keybd_event(VK_NUMLOCK, 0, 0, 0)

 End Sub

 下記も付け足しました。

 ここでkeybd_event関数を知りました。

 勉強しようと思いました。
 ですが、限界が来ました。
 色々教えて頂きたく思います。
 何卒、宜しくお願い致します。

 質問1
 >まず、このような感じで  1863  と 
 >打つには、一文字ずつ keyDown keyup しないといけないのでしょうか?
 こちらなのですが、keybd_eventは、一括で1863と入力出来ないのでしょうか?

 質問2
 >keybd_event はそれより低位のAPIですから
 こちらなのですが、何の位が低いのでしょうか?

 質問3
 CreateObject("WScript.Shell")を行使しますと、
 精度が良いのでしょうか?
 (体感できずにいます)

 質問4
 A: Call keybd_event(VK_DOWN, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
 B: Call keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0)

 こちらなのですが、キーを離す場合、二通りある感じなのですが、
 A:の場合は、拡張キーにおいて、使いなさいと書いてありました。
 拡張キーは、下記のものだと思うのですが、

 '(テンキーの数字と、数字のしたの矢印etc)
 '  0 . 1 2 3 4 5 6 7 8 9 /
 'Enterキー
 '↑ ← → ↓
 'Insert
 'Del
 'Home
 'End
 'PageUp
 'PageDown
 '右Ctrl
 '右Alt
 'Break '
 'PrintScreen
 '左右Windowsキー
 'メニューキー

 メニューキー(altキー)を離すときに、A:を使用しますと
 altキーが押されっぱなしの状態で終了します。
 altキーは拡張キーではないのでしょうか?

 また、キーを離す場合、二通りある感じ というのは、誤認識なのでしょうか?

 また、第3パラメーターの KEYEVENTF_KEYUP は、定数2 と同じだと思うのですが、
 多くは、KEYEVENTF_KEYUP と 書かれていますが、これは、見やすさの為なのでしょうか?

 いっぱいの質問で申し訳御座いません。
 宜しくお願い致します。
 (enomoto)

 追加編集します。すみません。

 sendkeysは、不安定とよく見かけましたので、
 keybd_eventの方に移行しようと考えました。
 keybd_eventの方が確実なのでしょうか?(doeventsを入れようと思います。)

 宜しくお願い致します。

 (enomoto) 8:57


 もう一歩踏み込んで説明があると嬉しいのですが、何でキー入力を使用したいのでしょうか。

 個人的な感触としては、そもそもキー入力を制御や入力に使用するというのは信頼性が
 低い手法だと思っています。
 システム負荷で画面遷移が追従しなかったりユーザ操作の干渉で、期待通りの入力に
 ならなくなってしまうことは、容易に起こりうるので。

 そのあたりはさておき、ご質問への回答です。
 まず問2ですが、低位(低レベル)というのは悪い意味ではなく、よりシステム
 (or ハードウェア)に近いインタフェースという意味です。

 ですから、キー操作一つとってもキーコード、キーダウン、キーアップと細かい制御が
 必要です。
 その代わりに SendKeys ではできない、キーダウンの時間の制御や PritScr も入力する
 ことが出来ます。

 で問1ですが、上記の理由で文字列の入力などは出来ません。
 それを行う関数を自作したり、それであれば SendKeys を使ったほうが良いでしょう。

 問3に関しては、そう書いてあるサイトの説明でも読まなければ一概に判断できませんが、
 私にはその理由が推測できませんので、他の識者の回答をお待ち下さい。

 問4ですが、まず
 > また、キーを離す場合、二通りある感じ というのは、誤認識なのでしょうか?
 に関してはご認識です。
 キーによっては KEYEVENTF_EXTENDEDKEY の有無によらず同じ動作をするキーもありますが
 基本的には DOWN したキーを UP する使い方をすべきです。

 > keybd_eventの方が確実なのでしょうか?(doeventsを入れようと思います。)
 API の方が出来る範囲は広いですが、低レベルの処理では、使う側が正しい知識と手順を
 持ってコントロールする必要があります。

 SendKeys で何か不具合が合ったのでしょうか?
 (Mook)

 Mookさん このような質問にお答え頂き、
 また、Mookさんの貴重なお時間を奪い、
 申し訳なさと、感謝の気持ちでいっぱいです。

 ありがとうございます。

 >SendKeys で何か不具合が合ったのでしょうか?
 全く持ってございません。
 Mookさんには、申し訳ないのですが、
 自己分析しますと 一番の理由が好奇心だと思います。
 申し訳御座いませんでした。

 >もう一歩踏み込んで説明があると嬉しいのですが、何でキー入力を使用したいのでしょうか。

 棚卸しです。
 棚卸しのexeがあるのですが、
 そこに商品コードと数量を打ち込む作業を従業員がします。
 1000番から始まった商品コードですが、
 最初は、タイピングミスもなく上手く行っていたのですが、
 現在は、商品コードが6ケタになっています。
 ですので、タイピングが上手く行かない場合があると同時に
 商品コードのみの入力となるため、商品名、カラー、サイズなどが、
 反映せず、まちがって入力してもその場ではわからないというのが現状です。
 ですので、vbaで表をつくりました。

   _A___B___C____D___E___F____

 1_                  サイズ
 2_商品名__カラー   1     2      3    4
 3_ aaa     black    125861    125862    125863   125864 ←これは商品コードです。
 4_ aaa     black      

 この様な感じです。
 一つの商品に対して 二行つかいます。
 商品1行目のa列、b列、の 商品名、カラーは rgb(255,255,255) となっています。
 従業員の方は この2行目に在庫数を打ち込むだけとなっています。
 そして、ボタンを押すと、サーチして商品コードと数値のみを取り出します。
 それを配列に入れて、棚卸exeを WshShell.Run で起動
 FindWindow FindWindowEx EnumWindows などで 探し出して
 自動入力させることにしています。
(現在は、シートに列挙させてcaptionをマッチさせています。)
 (親を先に閉じることはできないので、loopさせてフラッグをたてています。)
 もちろん 今のところ バグの報告もありませんから、上手く動いています。

 ですので、keybd_event は好奇心だけだと思います。
 すみません。
 keybd_eventでもいけるのではと いっぱい検索しましたが、わからずにいました。
 apiは正直怖いです。何度も何度もファイルごと壊れてしまいました。
 コンピュータに自分がまけているみたいで、すごい悔しいのでしょうね。
 情けない事に ただ単に 自分にスキルが無いだけなんですが;

 >それを行う関数を自作したり、それであれば SendKeys を使ったほうが良いでしょう。

 身に沁みました。
 本当にありがとうございました。
 変な質問ばかりですが、どうか、また 宜しくお願い致します。

 (enomoto)


 蛇足ですが、
 質問の理由が好奇心だから、というのは決して悪い理由ではありません。

 ただ、業務で運用する際には、それが本当にベストな方法であるかは判断の必要があると
 思います。

 キー入力一つにとっても、SendKeys や API によるいろいろな方法がありますし、それらを
 知っていれば、今回でなくともどこかで使用する機会はあるかもしれません。
 (たとえば、キーを3秒間押したいとか、PrtScr をキー制御したいとか)

 誰でも初めはわからないことが多いですが、しっかり理解をし知識の幅を増やしていく
 ことで、技術力というのは向上するのだと思います。
  (Mook)

 お言葉、有難うございました。
 また、宜しくお願い致します。

 (enomoto)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.