tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^4: NOTEPAD に、テキストBOXの内容を書き出したい
投稿日: 2005/11/12(Sat) 09:41
投稿者なおこ(・∀・)
お世話になります。

花ちゃんさんへ
> 下記を.NET 用に移植して下さい。
> hhttp://www.bcap.co.jp/hanafusa/VBHLP/keybdeve.htm

こんな感じでやってみましたがいかがでしょうか。
WindowsXP(SP2)では特に問題なく動きました。
# ほとんど、花ちゃんさんのソースのコピーですが(^_^;)

Imports System.Runtime.InteropServices

Public Class Form1
  Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "

#End Region

  'キーストロークをシミュレートする(P1065)
  <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  Private Shared Sub keybd_event( _
            ByVal bVk As Byte, _
            ByVal bscan As Integer, _
            ByVal dwflags As Integer, _
            ByVal dwExtraInfo As IntPtr)
  End Sub
  Private Const KEYEVENTF_KEYUP As Integer = &H2   'キーアップ
  Private Const KEYEVENTF_EXTENDEDKEY As Integer = &H1  'スキャンコードは拡張コード

  '仮想キーコード・ASCII値・スキャンコード間でコードを変換する(P1067)
  <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  Private Shared Function MapVirtualKey( _
            ByVal uCode As Integer, _
            ByVal uMapType As Integer) _
            As Integer
  End Function
  '==================================================================
  'システムを立ち上げてからの経過時間を高精度に取得する(P1002)
  <DllImport("winmm.dll", CharSet:=CharSet.Auto)> _
  Private Shared Function timeGetTime() _
                      As Integer
  End Function

  <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  Private Shared Function OpenClipboard( _
                       ByVal hWndNewOwner As IntPtr) _
                       As Boolean
  End Function

  <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  Private Shared Function EmptyClipboard() _
                       As Boolean
  End Function

  <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  Private Shared Function CloseClipboard() _
                       As Boolean
  End Function


  Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles
Button1.Click
    '別途メモ帳を起動し、何か記入しておいて下さい。
    AppActivate("無題 - メモ帳") '注意! Win95 はメモがカタカナ半角
    Me.StopTime(100)         'アクティブになるまで待つ
    'For i As Integer = 1 To 10 'このような連続使用も問題なし
    Me.sSetSendKeys(Keys.Menu, Keys.E, Keys.A) 'すべて選択
    Me.sSetSendKeys(Keys.ControlKey, Keys.C)  'コピー
    Me.sSetSendKeys(Keys.Right)     '→ 右に移動(選択解除)
    'Next
  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button2.Click
    'Button1_Click後に実施して下さい。
    AppActivate("無題 - メモ帳")
    Me.StopTime(100)         'アクティブになるまで待つ
    'For i As Integer = 1 To 10
    Me.sSetSendKeys(Keys.Right)    '→ 右に移動(選択解除)
    Me.sSetSendKeys(Keys.ControlKey, Keys.V) '貼り付け
    'Next
  End Sub

  Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button3.Click
    'データ(文字列)をアクティブウィンドウに送ります。
    AppActivate("無題 - メモ帳")
    Me.StopTime(100)        'アクティブになるまで待つ
    'For i As Integer = 1 To 10
    Me.sSetSendTxts(Me.TextBox1.Text & ControlChars.NewLine)
    'Next i
  End Sub

  Private Sub sSetSendKeys(ByVal bVk1 As Integer, _
  Optional ByVal bVk2 As Integer = 0, Optional ByVal bVk3 As Integer = 0)

    Dim byteKey1 As Byte = CType(bVk1, Byte)
    Dim byteKey2 As Byte = CType(bVk2, Byte)
    Dim byteKey3 As Byte = CType(bVk3, Byte)

    'SendKeys と同様にアクティブウィンドウにキーストロークを送る
    '以下のパターンは必要により追加して下さい。
    If bVk2 = 0& And bVk3 = 0& Then
      'キーを1個だけ送る
      keybd_event(byteKey1, MapVirtualKey(byteKey1, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or 0, IntPtr.Zero)
      keybd_event(byteKey1, MapVirtualKey(byteKey1, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or Me.KEYEVENTF_KEYUP, IntPtr.Zero)
    ElseIf bVk3 = 0& Then
      'キーの複合操作 [Alt] + [E] 等
      keybd_event(byteKey1, MapVirtualKey(byteKey1, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or 0, IntPtr.Zero)
      keybd_event(byteKey2, MapVirtualKey(byteKey2, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or 0, IntPtr.Zero)
      keybd_event(byteKey2, MapVirtualKey(byteKey2, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or Me.KEYEVENTF_KEYUP, IntPtr.Zero)
      keybd_event(byteKey1, MapVirtualKey(byteKey1, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or Me.KEYEVENTF_KEYUP, IntPtr.Zero)
    ElseIf (bVk1 <> 0&) And (bVk2 <> 0&) And (bVk3 <> 0&) Then
      'SendKeys.Send("%(EA)") と同様の操作
      keybd_event(byteKey1, MapVirtualKey(byteKey1, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or 0, IntPtr.Zero)
      keybd_event(byteKey2, MapVirtualKey(byteKey2, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or 0, IntPtr.Zero)
      keybd_event(byteKey2, MapVirtualKey(byteKey2, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or Me.KEYEVENTF_KEYUP, IntPtr.Zero)
      keybd_event(byteKey3, MapVirtualKey(byteKey3, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or 0, IntPtr.Zero)
      keybd_event(byteKey3, MapVirtualKey(byteKey3, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or Me.KEYEVENTF_KEYUP, IntPtr.Zero)
      keybd_event(byteKey1, MapVirtualKey(byteKey1, 0), _
            Me.KEYEVENTF_EXTENDEDKEY Or Me.KEYEVENTF_KEYUP, IntPtr.Zero)
    End If
    Me.StopTime(50)  '連続処理した場合を考慮
  End Sub

  Private Sub sSetSendTxts(ByVal MyString As String)
    'SendKeys と同様にデータ(文字列)をアクティブウィンドウに送ります。
    'クリップボードを初期化
    Me.ClearClipboard()
    Me.StopTime(10)
    '選択した範囲のテキストをコピー
    Clipboard.SetDataObject(MyString)
    Me.StopTime(10)
    Me.sSetSendKeys(Keys.ControlKey, Keys.V) '貼り付け
    Me.StopTime(10)
  End Sub

  Private Sub StopTime(ByVal st As Integer)
    '指定の時間待つ(1/1000 秒単位で指定)
    Dim intSt As Integer
    intSt = timeGetTime()
    Do While timeGetTime() - intSt < st
      System.Windows.Forms.Application.DoEvents()
    Loop
  End Sub

  'クリップボードの中身を空にする
  Private Sub ClearClipboard()
    If OpenClipboard(Me.Handle) Then
      Try
        EmptyClipboard()
      Finally
        CloseClipboard()
      End Try
    End If
  End Sub
End Class

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。