パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

コンソール出力を直接メモ帳へ書き込み」記事へのコメント

  • クラス名"Edit"のウィンドウをメモ帳の子ウィンドウからFindWindowExで探してWM_SETTEXTかEM_REPLACESELで投げつける。
    Windows 11の新しいメモ帳ではクラス名を変えないと動かないけど、そもそも新しいメモ帳はタイトルも「無題 - メモ帳」ではないのでWindows 10専用ということで。

    • SendMessageでテキスト送りつけられる [coocan.jp]のを初めて知った。
      SendMessageはWM_CLOSEでウィンドウ閉じたり電卓のボタン押させたりする [perl-users.jp]位でしか使うシーンが思い浮かべられなかったし、不必要に使うとシステムが不安定化するみたいな心配があって積極的には触れてこなかった。
      いま改めてSendMessageを使う決心をしてみるとWin32::GuiTest [metacpan.org]にも

      SendMessage(hWnd,Msg,wParam,lParam)
      WMSetText($hwnd)

      の様な関数が用意されていることにも気付けた。
      それらを利用して試行錯誤でワンライナ書いてみた。

      hogehoge | perl -MWin32::GuiTest=:ALL -ne "BEGIN{($hwnd)=grep{GetWindowText($_)!~/cmd\.exe/}FindWindowLike(undef, qq/無題 - メモ帳/);($edit)=grep{GetClassName($_) eq 'Edit'}GetChildWindows($hwnd)}WMSetText($edit,WMGetText($edit) . qq/$_/)"

      最初Editの親の方にテキスト送りつけていてウィンドウタイトルを一生懸命書き換えていた。
      伺か [sakura.vg]にそんな機能あったな。
      Editにテキストをセットするのも毎行書き換えてしまうので一旦WMGetTextで取り出したものに連結していくようにしたがなんか冗長な感じがなくもない。

      親コメント
      • by Anonymous Coward

        EM_SETSEL(初回のみカーソル位置移動)とEM_REPLACESEL(置換と言いつつ未選択なら追記)でやれば追記になるからスッキリすると思う。

        • 最初のコメント [srad.jp]で何でEM_REPLACESEL [microsoft.com](0xC2 [ipentec.com])が提示されてるのかと訝しんだが伏線だったのか。
          一人でドキュメント読んでたら気付かなかったことを考えると恥ずかしさに耐えて日記書いてよかったのか。

          PerlならWin32::GuiTestのWMSetTextをSendMessageに変えれば簡単だろうと思ったらモジュールの仕様上子ウィンドウに対して使えないらしく、結局Win32::APIで呼ぶ羽目になった。

          hogehoge | perl -MWin32::GuiTest=:ALL -MWin32::API -ne "BEGIN{($hwnd)=grep{GetWindowText($_)!~/cmd\.exe/}FindWindowLike(undef, qq/無題 - メモ帳/);($edit)=grep{GetClassName($_) eq 'Edit'}GetChildWindows($hwnd)}Win32::API->new('user32','SendMessageA','NNNP','N')->Call($edit,0xc2,0,qq/$_/)"

          親コメント

一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy

処理中...