タイトル | : Re^4: NOTEPAD に、テキストBOXの内容を書き出したい |
記事No | : 2558 |
投稿日 | : 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
|