tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルNOTEPAD に、テキストBOXの内容を書き出したい
記事No2550
投稿日: 2005/11/11(Fri) 10:29
投稿者VB勉強中
[OSのVer]:Windows    [VBのVer]:VB.NET  

Processクラスを利用し、NOTEPADを起動さるところまではここの掲示板でわったのですが下記を実現

る方法がわかりません。

ボタン等を押したときにNOTEPADを起動させ、起動直後に起動元にあるテキストBOXの内容をNOTEPADへ
表示させたい。

よろしくお願いいたします。

ソース
    Private Sub ExecuteNOTEPAD()
        Dim proInfo As New ProcessStartInfo
        Dim proc As New Process

        proInfo.FileName = "NOTEPAD.EXE"
        proInfo.UseShellExecute = False

        Try
            proc = Process.Start(proInfo)
        Catch e As System.Exception
            MessageBox.Show("NOTEPAD.EXE" & "を起動できません。")
        End Try
end sub

[ツリー表示へ]
タイトルRe: NOTEPAD に、テキストBOXの内容を書き出したい
記事No2551
投稿日: 2005/11/11(Fri) 10:47
投稿者なおこ(・∀・)
お世話になります。

AppActivateして
hhttp://msdn.microsoft.com/library/ja/default.asp?
url=/library/ja/vblr7/html/vastmappactivate.asp

その直後にSendKeys
hhttp://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/script56/html/wsmthsendkeys.asp

でしょうか。
でも、ほかのアプリケーションの割り込みがあった場合は
必ずしもNotepad.exeにSendKeysされるわけではないのでご注意。

> [OSのVer]:Windows    [VBのVer]:VB.NET  
>
> Processクラスを利用し、NOTEPADを起動さるところまではここの掲示板でわったのですが下記を実現
> す
> る方法がわかりません。
>
> ボタン等を押したときにNOTEPADを起動させ、起動直後に起動元にあるテキストBOXの内容をNOTEPADへ
> 表示させたい。
>
> よろしくお願いいたします。
>
> ソース
>     Private Sub ExecuteNOTEPAD()
>         Dim proInfo As New ProcessStartInfo
>         Dim proc As New Process
>
>         proInfo.FileName = "NOTEPAD.EXE"
>         proInfo.UseShellExecute = False
>
>         Try
>             proc = Process.Start(proInfo)
>         Catch e As System.Exception
>             MessageBox.Show("NOTEPAD.EXE" & "を起動できません。")
>         End Try
> end sub

[ツリー表示へ]
タイトルRe^2: NOTEPAD に、テキストBOXの内容を書き出したい
記事No2552
投稿日: 2005/11/11(Fri) 11:30
投稿者VB勉強中
早速のアドバイスありがとうございます!

即実行してみました。
結果ですが、ノートパッドへのテキストボックスへの出力はできたのですが、下記に2点の新たな問題

発生しました。
1.テキストボックは、マルチライン=TRUEになっており改行 Chr(13) & Chr(10)が入っている
    その為か、ノートパッド上では空白行が挿入されてしまう
2.半角カタガナが化ける?

解決方法がありましたら、よろしくお願いいたします。

改善したソースを記述しておきます。
 ※processでNOTEPAD起動直後にアクティブになるようでappactiveは不要でした。

    Private Sub ExecuteNOTEPAD()
        Dim proInfo As New ProcessStartInfo
        Dim proc As New Process

        proInfo.FileName = "NOTEPAD.EXE"
        proInfo.UseShellExecute = False

        Try
            proc = Process.Start(proInfo)
        Catch e As System.Exception
            MessageBox.Show("NOTEPAD.EXE" & "を起動できません。")
        End Try

        proc.WaitForInputIdle()

        SendKeys.Send(Me.SQL.Text)

    End Sub

[ツリー表示へ]
タイトルRe^3: NOTEPAD に、テキストBOXの内容を書き出したい
記事No2553
投稿日: 2005/11/11(Fri) 12:23
投稿者花ちゃん

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

そうすれば下記のようなサンプルができますよ。

下記 No.159 04[アプリケーション] 未掲載 指定のアプリの指定の位置に文字列をペーストする
hhttp://www.bcap.co.jp/hanafusa/dotnet/Sample.htm

[ツリー表示へ]
タイトルRe^4: NOTEPAD に、テキストBOXの内容を書き出したい
記事No2556
投稿日: 2005/11/11(Fri) 17:22
投稿者VB勉強中
[OSのVer]:Windows    [VBのVer]:VB.NET  

なおこ(・∀・)さん、花ちゃんさん、アドバイスありがとうございます。

がんばって、移植?をして見ます。 うまくいっても、いかなくてもまた連絡いたします。

[ツリー表示へ]
タイトルRe^4: NOTEPAD に、テキストBOXの内容を書き出したい
記事No2558
投稿日: 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

[ツリー表示へ]
タイトルRe^5: NOTEPAD に、テキストBOXの内容を書き出したい
記事No2563
投稿日: 2005/11/14(Mon) 08:48
投稿者VB勉強中
なおこ(・∀・)さん、ありがとうございます!
実は移植してみますと言ってみたものの・・・vbKeyControl, vbKeyV とかで
エラーが出て挫折していたところでした。

早速、試してみます。 

[ツリー表示へ]
タイトル出来ました!
記事No2564
投稿日: 2005/11/14(Mon) 09:18
投稿者VB勉強中
なおこ(・∀・)さん、出来ました! 
貴重な時間を費やしていただきありがとうございました。

正直、どのような仕組みで動いているのかまだまだ若くしには理解できませんが、一つ一つ命令を調べ

理解できるようがんばってみます!
 ※丸ごとコピーでやりたいことは達成できました。

あと、ソースを提供してくださった、花ちゃんへも感謝です。

[ツリー表示へ]