tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
他のアプリ上でのキー操作用に特化したDLLの使用例(VB.NET) ( No.0 )  [親スレッドへ]
日時: 2012/07/07 13:16
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[キー操作][][]                            *
* キーワード:キーストローク ,キーボード,キー入力,キーコード,他のアプリ,SendKeys  *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.07.07
'投 稿 者:VBレスキュー(花ちゃん)
'SampleNo:453 2012.07.07 @ 2012.07.07
'タイトル:他のアプリ上でのキー操作用に特化したDLLの使用例(453) - VB2010
'動作確認:WindowsVista / Windows 7 / VB2010(VS2010 Pro) Framework 4 / ターゲットCPU:X86
'[Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定
'---------------------------------------------------------------------------------------------------
'別途、SendInput2.dll / SendInput2.xlm をこの exe と同じフォルダーにコピーしておいて下さい。
'プロジェクト→参照の追加→参照タブ→ \このexeの起動フォルダー\SendInput2.dll を参照追加して下さい。
'ソースコードは、保存オプションの詳細設定で、日本語(シフトJIS)-コードページ932 で保存しております。
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
SendInput 関数用のDLLを作るなら、他のアプリにキーストロークを送るのに必要な機能を一纏めにしたら
かなり便利になり誰にでも簡単に使用する事ができるのではないかと思い作ってみました。
Excel の画面にショートカットキーを送って操作したいような場合やWeb上での各パスワードを入力するような
場合とか、他のアプリ上で、キー操作をしたいような時に気軽に使用出来て便利かと思います。

SendInput 関数については、下記に掲載しておりますので参考にして下さい。
 http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=245&no=0

機能としては、下記のようなものがあります。

SendInput2.dll の機能
  GetCaption     アクティブウィンドウのタイトルを取得
  fGetForGrdWindow() アクティブウィンドウのハンドルを取得
  fSetForGrdWindow() 指定のウィンドウをトップ位置に移動しアクティブにする
  KeyDown()      指定キーのキーダウン操作
  KeyReSet()     指定の一連のキー操作を初期化する
  KeyStroke()     指定の一連のキー操作を一括で実行
  KeyUP()       指定キーのキーアップ操作
  WaitTime()     指定時間待つ安全な待機関数

SendInput2.dll は、VB2005 以降で使用できるように、Framework 2.0 / ターゲットCPU:X86 でコンパイル
しておりますが、不具合や要望等ありましたら、雑談用掲示板にでも書き込み下さい。

下記より、ダウンロードして、EXE と同じフォルダーにでも解凍し、参照設定してお使い下さい。
ダウンロード先 http://www.hanatyan.sakura.ne.jp/freesoft/SendInput2.zip

'---------------------------------------------------------------------------------------------------

Public Class Form1

#Region "アクティブウィンドウのハンドルを取得部分"

Private hwnd As IntPtr

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
'別途、ハンドルを取得しているならこの部分は必要ありません。
   'エラーが表示されたらSendInput2.dllへの参照設定を確認して下さい。
   Dim si As New SendInput2.Helper()

   'アクティブウィンドウのハンドルを取得。
   '引数は、各メッセージボックスを表示している時間を指定(指定しなければ、3秒間表示)
   hwnd = si.fGetForGrdWindow(2000)
   '下記も参考に表示しているだけです。
   Label2.Text = "Handle:" & hwnd.ToString()
   Label3.Text = "Caption:" & si.GetCaption()
End Sub

#End Region

#Region "SendInputHelper.DLL によるキーボード操作例"

Private Sub Button2_Click_1(sender As System.Object, e As System.EventArgs) Handles Button2.Click
   Dim myText As String = ""
   myText = "このDLLは、他のアプリにキーストロークをシミュレートする為の" & vbCrLf & _
            "機能を纏めたDLLです。"
   'データをシステム クリップボードに貼り付けます(テスト用のデータを作成)
   System.Windows.Forms.Clipboard.SetDataObject(myText, True)

   'エラーが表示されたらSendInput2.dllへの参照設定を確認して下さい。
   Dim si As New SendInput2.Helper()
   If hwnd <> IntPtr.Zero Then

      '指定のウィンドウをアクティブにする(最小化の場合は元のサイズで表示)
      'SetForegroundWindow ではアクティブにならない場合の対策済み
      si.fSetForGrdWindow(hwnd)

      'MsgWaitForMultipleObjects API を使っての安全な待機関数(ミリ秒単位で指定)
      'Thread.Sleep メソッド のようなスレッドを停止するような事をしていないので安全かと。
      si.WaitTime(500)              'その間、0.5秒待つ(最小化になっている場合もあるので)

      '下記のように実行したいキー操作をマクロの記録のように書き込んで下さい。
      'SendInput API を使ってのキー操作に付き割り込みが入らず安全です。
      ' http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=245&no=0
      si.KeyReSet()                 'キー操作の初期化(使用した変数等の初期化)
      si.KeyDown(Keys.A)            'Aキーの押し下げの動作を記録(実際の操作は行われない)
      si.KeyUP(Keys.A)              'Aキーの解放の動作を記録
      si.KeyDown(Keys.B)            '同様に夫々のキー操作を記録
      si.KeyUP(Keys.B)
      si.KeyDown(Keys.Enter)        '改行
      si.KeyUP(Keys.Enter)
      si.KeyDown(Keys.ControlKey)   '続けてクリップボードのテキストをペーストします。
      si.KeyDown(Keys.V)
      si.KeyUP(Keys.V)
      si.KeyUP(Keys.ControlKey)
      si.KeyStroke()                '上記一連のキー操作を一括で実行(ここで初めてキー操作を実行)

      MessageBox.Show("続けて記入した内容を削除します。", "削除確認", MessageBoxButtons.OK, _
                               MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, _
                               MessageBoxOptions.DefaultDesktopOnly)
      si.KeyReSet()
      si.fSetForGrdWindow(hwnd)     '指定のウィンドウをアクティブにする
      si.WaitTime(500)              'その間、0.5秒待つ

      si.KeyReSet()                 'キー操作の初期化
      si.KeyDown(Keys.ControlKey)   'すべて選択
      si.KeyDown(Keys.A)
      si.KeyUP(Keys.A)
      si.KeyUP(Keys.ControlKey)     '削除する
      si.KeyDown(Keys.Delete)
      si.KeyUP(Keys.Delete)
      si.KeyStroke()                '上記一連のキー操作を実行
   End If
End Sub

#End Region

#Region "起動時の処理及びWin32 API 関数の宣言及び変数の宣言"

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
'この部分は、必須ではありません。
   'Form を右下の邪魔にならない位置に表示
   Dim w As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
   Dim h As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
   Me.Top = h - Me.Height - 35
   Me.Left = w - Me.Width - 25
   Me.TopMost = True    'メッセージボックスがアプリ等の裏に隠れるのを防止する為に。
End Sub

#End Region

End Class


実行結果等の図及び配置図(画像をクリックすると元のサイズで見る事ができます。)



 [スレッド一覧へ] [親スレッドへ]