tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル他のアプリからテキストを取得したい
記事No7793
投稿日: 2008/07/09(Wed) 23:19
投稿者田所
はじめまして。
VB2005を使用しております。
他のアプリからテキストを取得するプログラムを組もうと考えております。
とりあえず、メモ帳からと考えて、小ウインドウのハンドル取得までは
出来、sendmessageのWM_GETTEXTを使用すれば良いと言う所までは調べましたが
上手く動きません。
またwParamと、lParamには何を入れれば良いのでしょうか?

以下、現在作成中の問題では無いかと思う箇所だけをサンプルで記載いたします。

<API宣言>
Private Declare Function SendMessage Lib "user32.dll" _
   Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long

Const WM_GETTEXT = &HD

<sendmessage使用箇所>
Dim ret As Long
ret = SendMessage(hwd_c, WM_GETTEXT,wParam, lParam)'wParamと、lParamに何を入れて良いかわからない。

なお、他のサイトに載っていましたサンプルから
Dim cap As String
cap = Space$(200)
SendMessage(hwd_c, WM_GETTEXT,200, cap)
と言った物を使ってみましたが、うまく行きません。

よろしければ御教授ください。
よろしくお願いします。

[ツリー表示へ]
タイトルRe: 他のアプリからテキストを取得したい
記事No7795
投稿日: 2008/07/10(Thu) 07:56
投稿者花ちゃん
> 他のアプリからテキストを取得するプログラムを組もうと考えております。
どのような目的で、どのようなアプリから取得したいのかをハッキリさせた
方がいいかと思います。
目的と対象のアプリによっては、ベストな方法が大きく違ってきます。

> とりあえず、メモ帳からと考えて、小ウインドウのハンドル取得までは
メモ帳 と Word では方法も変わってくるかと思います。
又、目的や方法によって色々なやり方があります。
VB6.0 のコードですが、下記のようにしても取得できます。(場合によっては、
こちらの方法が実用的かも知れません)
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?no=12717&reno=12715&oya=12715&mode=msgview&page=0

> Private Declare Function SendMessage Lib "user32.dll" _
>    Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, _
>    ByVal wParam As Long, ByVal lParam As Long) As Long
上記は、VB6.0 用の宣言で .NET では、変数の型等が違いますので変更が必要です。

> ret = SendMessage(hwd_c, WM_GETTEXT,wParam, lParam)'wParamと、lParamに何を入れて良いかわからない。

WM_GETTEXT や SendMessage をキーワードにしてWEB上を検索すれば見つかります。
但し、あまり実用的な方法で無い性かそのものズバリのサンプルは少ないようです。

ご自分で調べて実装できないと、応用もできないし、上記の方法に拘ってしまうので
もう少し、頑張って調べて見て下さい。 

[ツリー表示へ]
タイトルRe^2: 他のアプリからテキストを取得したい
記事No7796
投稿日: 2008/07/10(Thu) 10:27
投稿者田所
ご返答ありがとうございます。
相当調べたのですが、上手く行かなかったので、投稿させて頂いたしだいなのです。
再度調べ直し、勉強してみます。

一つだけ教えていただきたいのですが、
API宣言の
lParam As Long
の箇所 
サンプル等ではAnyを使用している物が多いですが
VB2005では、Anyは使えないとの事で、Longとしてありますが
そうしてしまうと
SendMessage(hwd_c, WM_GETTEXT,wParam, lParam)
において、型が異なるとのメッセージが表示されてしまいます。
lParamはポインタではないかとは思っているのですが、
Long型ではだめなのでしょうか?
ためしにstring型として宣言するとエラーは出ないのですが、
正常に動作はしません(テキストを取得出来ない)
もしこの考えが正しいのならば他に原因があるかと思いますので
全体をもう一度見直し、調べてみます。

どうにも勉強不足ですいません。
まったく検討違いな事をまた書いてしまっていたらすいません。

[ツリー表示へ]
タイトルRe^3: 他のアプリからテキストを取得したい
記事No7798
投稿日: 2008/07/10(Thu) 11:58
投稿者花ちゃん
> 相当調べたのですが、上手く行かなかったので、投稿させて頂いたしだいなのです。

相当調べたのならいくらでも見つかったはずですが?

> サンプル等ではAnyを使用している物が多いですが
> VB2005では、Anyは使えないとの事で、Longとしてありますが
> そうしてしまうと
> SendMessage(hwd_c, WM_GETTEXT,wParam, lParam)
> において、型が異なるとのメッセージが表示されてしまいます。

だから、WM_GETTEXT や SendMessage をキーワードにしてWEB上を検索すれば見つかります
と回答したはずですが、この掲示板のワード検索で SendMessage で検索しても例が
いくつか見つかりますよ。

WEB上なら
http://tinyurl.com/6pggap

http://yokohama.cool.ne.jp/chokuto/urawaza/message/WM_GETTEXT.html

下記の5・6番目あたりとか
http://tinyurl.com/692wkt

[ツリー表示へ]
タイトルRe^3: 他のアプリからテキストを取得したい
記事No7800
投稿日: 2008/07/10(Thu) 13:24
投稿者魔界の仮面弁士
> lParam As Long
ByVal な Loog では駄目でしょう。ByRef Long や ByVal UInteger ならばともかく。
汎用目的では ByVal IntPtr にしておく事が多いですね。

なお、メッセージの内容にあわせて、wparam / lparam の型を変えて
オーバーロード定義する事も珍しくはありませんので、サンプル等によって
異なる宣言になっている事もあります。
WM_GETTEXT なら、ByVal lParam As StringBuilder あたりにしておくと楽かな。

# 投稿キーが「ぞろ目」だっ! とちょっと喜びつつ、長時間放置しておいたら、
# 『投稿キーが制限時間を超過しました。』エラーで再投稿する羽目に。orz

[ツリー表示へ]
タイトル単純なサンプル
記事No7801
投稿日: 2008/07/10(Thu) 15:45
投稿者花ちゃん
動作確認だけの単純なサンプル

Public Class Form1

<System.Runtime.InteropServices.DllImport("USER32.DLL", _
    CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function SendMessage( _
    ByVal hWnd As IntPtr, _
    ByVal wMsg As Integer, _
    ByVal wParam As Integer, _
    ByVal lParam As String) As Integer
End Function

Private Const WM_GETTEXT As Integer = &HD

Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
   Dim bs As Integer = TextBox1.TextLength + 1
   Dim buf As String = New String(CChar(" "), bs)
   bs = SendMessage(TextBox1.Handle, WM_GETTEXT, bs, buf)
   MessageBox.Show(buf)
End Sub

End Class

[ツリー表示へ]