DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WM_GETTEXTの使い方

  • 題名: WM_GETTEXTの使い方
  • 著者: 太助
  • 日時: 2010/01/07 17:01:21
  • ID: 26202
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[VB 2008]
分類:[.NET]

初めまして、素人質問ですみません。

VB6にてWindowを列挙し、そのテキストの内容を取得していました。
EnumChildWindows → SendMessage

それをVB2008にて組み直した時に以下のエラーが出ました。

VB6:
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long

ret = SendMessage(hwnd, WM_GETTEXT, Len(CaptionName), ByVal CaptionName)

VB2008:
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Integer, ByVal wMsg As Integer, _
ByVal wParam As Integer, ByVal lParam As Object) As Integer

ret = SendMessage(hwnd, WM_GETTEXT, Len(CaptionName), CaptionName)

文字列ポインタ引数の型を、AnyからObjectに変えた事意外に変更が
見当たらないのですが、正常にテキストの値を取得してくれません。

何が悪いのでしょうか、どうかご教示ください。
■No26202に返信(太助さんの記事)
> Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
> (ByVal hwnd As Integer, ByVal wMsg As Integer, _
> ByVal wParam As Integer, ByVal lParam As Object) As Integer

Alias を指定せずに、
  Private Declare Auto Function SendMessage Lib "user32"
とした方が都合が良いかと思います。

Win9X 系が駆逐された現在、SendMessageA を使い続ける必要は無いと思います。
SendMessageW を使うようにしないと、Shift_JIS で表現できない文字が
使われていた場合、正しく取得できません。

また、EnumChildWindows 等の「ハンドル」を表す場合、Integer でも
一応動作はしますが、本来は IntPtr 型を使うのが作法です。
(Form の Handle プロパティも IntPtr ですよね)

> 文字列ポインタ引数の型を、AnyからObjectに変えた事意外に変更が
> 見当たらないのですが、正常にテキストの値を取得してくれません。
文字列を受け取る方法は幾つかありますが、VB から扱うのであれば、
System.Text.StringBuilder を利用するのが楽かと思います。


もし、今回の SendMessage の宣言が WM_GETTEXT 用に限定されているのなら、
wParam は Integer、lParam は StringBuilder 型にして、このように書けます。

Dim buf As New StringBuilder()
buf.Length = 500
SendMessage(hwnd, WM_GETTEXT, buf.Length, buf)
MsgBox(buf.ToString())
  • 題名: Re[2]: WM_GETTEXTの使い方
  • 著者: 太助
  • 日時: 2010/01/08 9:49:06
  • ID: 26205
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
おはようございます。

■No26203に返信(魔界の仮面弁士さんの記事)
> Alias を指定せずに、
> Private Declare Auto Function SendMessage Lib "user32"
> とした方が都合が良いかと思います。
> また、EnumChildWindows 等の「ハンドル」を表す場合、Integer でも
> 一応動作はしますが、本来は IntPtr 型を使うのが作法です。

ありがとうございます、勉強になります。

>>文字列ポインタ引数の型を、AnyからObjectに変えた事意外に変更が
>>見当たらないのですが、正常にテキストの値を取得してくれません。
> 文字列を受け取る方法は幾つかありますが、VB から扱うのであれば、
> System.Text.StringBuilder を利用するのが楽かと思います。
> Dim buf As New StringBuilder()
> buf.Length = 500
> SendMessage(hwnd, WM_GETTEXT, buf.Length, buf)
> MsgBox(buf.ToString())

すごいです、出来ました!
現在コードを流用しただけで、なぜ取得出来たのかは理解出来ていないので
これから勉強します。

魔界の仮面弁士さんの記事はいつも拝見させて頂いております。
この度は、ありがとうございました^^
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板