[[20111208235225]] 『開いているメモ帳の内容に別の文字列を追加して元』(カシスソーダ) ページの最後に飛ぶ

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

 

『開いているメモ帳の内容に別の文字列を追加して元のメモ帳に反映』(カシスソーダ)
 先日、↓で開いているメモ帳の内容を取得する方法をご教示いただきました。
 ありがとうございました。

[[20111206231619]] 『開いているメモ帳の内容を取得する』(カシスソーダ)

 今度は、開いているメモ帳の内容に別の文字列を追加して元のメモ帳に反映させ
 ようとしています。

 ↓で試したのですが、追加する文字列(変数txtstrで指定)が反映されません。

 MsgBox newtxtstr

 でも

 lngRc = SendMessage(hWndEdit, WM_SETTEXT, 0, ByVal newtxtstr)

 でも既存のmyText部分のままです。
 どのように書き換えればいいのでしょうか?
 ご教示お願いいたします。

 Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
  (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
   ByVal lpszClass As String, ByVal lpszWindow As String) As Long

 Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
  (ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, _
   ByVal lParam As Any) As Long

 Const WM_GETTEXT As Long = &HD
 Const WM_SETTEXT As Long = &HC

 Sub test()
     Dim hWnd As Long, hWndEdit As Long
     Dim lngRet As Long
     Dim lngRc As Long
     Dim myText As String * 255
     Dim txtstr As String * 255
     Dim newtxtstr As String * 255

     txtstr = "hogehoge" & vbCrLf & "hogahoga" & vbCrLf & "hugahuga"

     hWnd = FindWindowEx(0, 0, "Notepad", vbNullString)
     Do While hWnd <> 0
         hWndEdit = FindWindowEx(hWnd, 0, "Edit", "")
         '既存文字列の取得
         lngRet = SendMessage(hWndEdit, WM_GETTEXT, Len(myText), ByVal myText)
         '既存文字列と新規文字列の結合
         newtxtstr = myText & vbCrLf & txtstr
         MsgBox newtxtstr
         '結合文字列の反映
         lngRc = SendMessage(hWndEdit, WM_SETTEXT, 0, ByVal newtxtstr)
         hWnd = FindWindowEx(0, hWnd, "Notepad", vbNullString)
     Loop
 End Sub

 また、開いているメモ帳の編集を破棄して閉じる方法も探しています。
 併せてご教示いただきましたら幸甚です。よろしくお願いいたします。

 Windows:XP-SP3
 Excel:2002

 NullCharも含めた255文字長のまま処理してるから見えないんじゃないですか?

 Sub test()
     Dim hWnd As Long, hWndEdit As Long
     Dim lngRet As Long
     Dim lngRc As Long
     Dim myText As String * 255
     Dim txtstr As String
     Dim newtxtstr As String
     Dim tmp As String

     txtstr = "hogehoge" & vbCrLf & "hogahoga" & vbCrLf & "hugahuga"

     hWnd = FindWindowEx(0, 0, "Notepad", vbNullString)
     Do While hWnd <> 0
         hWndEdit = FindWindowEx(hWnd, 0, "Edit", "")
         '既存文字列の取得
         lngRet = SendMessage(hWndEdit, WM_GETTEXT, Len(myText), ByVal myText)
         'Nullまでの文字を取得
         tmp = Left$(myText, InStr(1, myText, vbNullChar) - 1)
         '既存文字列と新規文字列の結合
         newtxtstr = tmp & vbCrLf & txtstr
         MsgBox newtxtstr
         '結合文字列の反映
         lngRc = SendMessage(hWndEdit, WM_SETTEXT, 0, newtxtstr)
         hWnd = FindWindowEx(0, hWnd, "Notepad", vbNullString)
     Loop
 End Sub

 メモ帳を閉じるのは

 Const WM_CLOSE   As Long = &H10

 Sub test2() 'メモ帳を閉じる
     Dim hWnd As Long
     Dim Ans  As Long
     hWnd = FindWindowEx(0, 0, "Notepad", vbNullString)
     Ans = SendMessage(hWnd, WM_CLOSE, 0&, 0&)
 End Sub

 とか
 (momo)

 momoさん、ご回答ありがとうございます。

 開いているメモ帳に結合した文字列を送り込むことが出来ました。
 ありがとうございました。

 併せてご教示いただきましたメモ帳を閉じるほうのコードですが、編集していない
 メモ帳は閉じてくれたのですが、編修してあるメモ帳(保存してあるメモ帳を開いた後
 上書きしていないもの)は
 「変更を保存しますか?」
 というウィンドウが表示されてしまいます。
 編修を破棄して 「変更を保存しますか?」のウィンドウを表示することなしに
閉じるようにするにはどのように書き換えればいいでしょうか。
 お手数おかけしますが再度ご教示いただきましたら幸甚です。
 よろしくお願いいたします。

 Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
  (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
   ByVal lpszClass As String, ByVal lpszWindow As String) As Long

 Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
  (ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, _
   ByVal lParam As Any) As Long

 Const WM_CLOSE   As Long = &H10

 Sub test()
  Dim hWnd As Long
  Dim Ans  As Long

     hWnd = FindWindowEx(0, 0, "Notepad", vbNullString)
     Do While hWnd <> 0
      Ans = SendMessage(hWnd, WM_CLOSE, 0&, 0&)
      hWnd = FindWindowEx(0, 0, "Notepad", vbNullString)
     Loop
 End Sub

 (カシスソーダ)

 返事が遅くなりました。
 WM_CLOSEで閉じないのならDESTROYを送ってやるとどうでしょう?

 Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
  (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
   ByVal lpszClass As String, ByVal lpszWindow As String) As Long

 Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
  (ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, _
   ByVal lParam As Any) As Long

 'Const WM_CLOSE   As Long = &H10
 Const WM_DESTROY As Long = &H2

 Sub test()
  Dim hwnd As Long
  Dim Ans  As Long

     hwnd = FindWindowEx(0, 0, "Notepad", vbNullString)
     Do While hwnd <> 0
      Ans = SendMessage(hwnd, WM_DESTROY, 0&, 0&)
      hwnd = FindWindowEx(0, hwnd, "Notepad", vbNullString)
     Loop
 End Sub

 (momo)

 momoさん、再度のご教示ありがとうございます。

 >WM_CLOSEで閉じないのならDESTROYを送ってやるとどうでしょう?

 ご教示いただきましたコードでうまくいきました。
 APIは難しくて敬遠していたのですが、もっと勉強してみます。
 ありがとうございました。

 (カシスソーダ)

コメント返信:

[ 一覧(最新更新順) ]


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