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

SendMessageにつきまして

環境/言語:[VB.NET 2005]
分類:[.NET]

2006/02/14(Tue) 20:38:34 編集(投稿者)



お世話になります。宜しくお願い致します。
VB6.0→VB.NET2005にアップグレード後SendMessageはVB.NET2005に変換
されますが、修正する必要のコメントが表示されました。
試しにSendMessageサンプルをダウンロードしても同じ結果になりました。
As Any キーワードは Visual Basic .NET ではサポートされませんとある
ことはわかりましたが、どのような方法で行えば良いのか参考になります
対処方法で、ご存じの方がおりましたらご教授を、お願いできませんでしょうか。
宜しくお願い致します。

--------------------参考例--------------------------------------------
'
'Ret = SendMessage(child, WM_GETTEXT, Len(txt), txt)  'VB6.0   
            ↓
     VB6.0→VB.NET2005にアップグレード
            ↓
Ret = SendMessage(child, WM_GETTEXT, Len(txt), ByVal txt) 'VB.NET2005
'
-----------------------------------------------------------------------
■No14996に返信(arakiさんの記事)
> As Any キーワードは Visual Basic .NET ではサポートされませんとある
> ことはわかりましたが、どのような方法で行えば良いのか参考になります
> 対処方法で、ご存じの方がおりましたらご教授を、お願いできませんでしょうか。

本来の型によって違います。
これは検索して調べることができます。

IntPtr か StringBuilder ですね。


__________________________________________________________________________________
じゃんぬ - Microsoft MVP for Visual Developer C#
  C#, VB.NET 入門  http://jeanne.wankuma.com/
  じゃんぬねっと日誌 http://blogs.wankuma.com/jeanne/
2006/02/15(Wed) 01:41:49 編集(投稿者)

じゃんぬねっと様、ご返信下さいましてありがとうございました。
まだ、解決はしませんが、何をすれば良いか少し分かって来ました。

_bas.vb に下記を追加しました。
--------------------------------------------------
<System.Runtime.InteropServices.DllImport("User32.Dll")> _
Function SendMessage( _
ByVal hWnd As IntPtr, _
ByVal Msg As Integer, _
ByVal wParam As Integer, _
ByVal lParam As Integer) As Integer
End Function
---------------------------------------------------

すみません。誤り記述がありましたので訂正しました。※ByVal txt → txt 

--------------------参考例-------------------------------------------------------
Public Const WM_GETTEXT As Short = &HDs 'コントロールのキャプション・テキストをバッファにコピー
Dim txt As String
txt = Space(255)

'Ret = SendMessage(child, WM_GETTEXT, Len(txt), txt)       'VB6.0   
            ↓
     VB6.0→VB.NET2005にアップグレード
            ↓                     ※
'@ Ret = SendMessage(child, WM_GETTEXT, Len(txt), txt)     'VB.NET2005
'
----------------------------------------------------------------------------------

@でString " " から型 'Integer' への変換は無効です。となります。
ご存じの方がおりましたらご教授を、お願いできませんでしょうか。
宜しくお願い致します。
■No15001に返信(arakiさんの記事)
> <System.Runtime.InteropServices.DllImport("User32.Dll")> _
> Function SendMessage( _
> ByVal hWnd As IntPtr, _
> ByVal Msg As Integer, _
> ByVal wParam As Integer, _
> ByVal lParam As Integer) As Integer
> End Function

えーっと、IntPtr か StringBuilder といったはずですが... (^^;)

> (1) でString " " から型 'Integer' への変換は無効です。となります。

そのままです。
型の概念がわからないのであれば P/Invoke はお勧めできないような...
文字列を渡したいのであれば、StringBuilder のオーバーロードを使ってください。

__________________________________________________________________________________
じゃんぬ - Microsoft MVP for Visual Developer C#
  C#, VB.NET 入門  http://jeanne.wankuma.com/
  じゃんぬねっと日誌 http://blogs.wankuma.com/jeanne/
じゃんぬねっと様、ご返信下さいましてありがとうございました。
SendMessageとIntPtrで検索しました。
追加しましたFunction SendMessage( _・・・ IntPtr
IntPtr か StringBuilder はSendMessageの関数
の代わりのAPI関数でしょうか。
すみません。よく分かっていませんでした
VB6.0のときはAPIのSendMessageを使用してできたのですが、VB.NETで試した所
Api_SendMessageでString " " から型 'Short' への変換は無効です。となります。

-------------------------------------------------------------------------

Declare Function Api_SendMessage Lib "user32" Alias "SendMessageA"(ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As Short) As Integer

Public Const WM_GETTEXT As Short = &HDs 'コントロールのキャプションをバッファへ
Dim txt As String
txt = Space(255)

'Ret = Api_SendMessage(child, WM_GETTEXT, Len(txt), txt)  ' VB6.0
'UPGRADE_WARNING: オブジェクト Ret の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。
Ret = Api_SendMessage(child, WM_GETTEXT, Len(txt), CShort(txt)) ' VB.NET 2005

-------------------------------------------------------------------------
> Declare Function Api_SendMessage Lib "user32"  Alias "SendMessageA"(ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As Short) As Integer

> 'Ret = Api_SendMessage(child, WM_GETTEXT, Len(txt),  txt)
上記の第4引数を文字列で扱いたいなら、宣言も ByVal lParam As String) に
変更して下さい。
文字列と整数値とどちらも扱う場合は、SendMessage API の宣言を2個両方の型で
宣言して下さい。
尚、.NET 関係で Win32 API関数を扱う場合は文字列の宣言は注意して下さい。
<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
■No15003に返信(arakiさんの記事)
> じゃんぬねっと様、ご返信下さいましてありがとうございました。
> SendMessageとIntPtrで検索しました。
> 追加しましたFunction SendMessage( _・・・ IntPtr
> IntPtr か StringBuilder はSendMessageの関数
> の代わりのAPI関数でしょうか。
> すみません。よく分かっていませんでした

仰ってる意味がよくわかりませんでしたが、こういうことです。
http://www.pinvoke.net/default.aspx/user32/SendMessage.html


___________________________________________________________________________________
じゃんぬ - Microsoft MVP for Visual Developer C#
  C#, VB.NET 入門  http://jeanne.wankuma.com/
  じゃんぬねっと日誌 http://blogs.wankuma.com/jeanne/
> IntPtr か StringBuilder はSendMessageの関数
> の代わりのAPI関数でしょうか。

IntPtrはポインタを示す.NETのデータ型、
StringBuilderは文字列を表す.NETのデータ型の一つです。
String型やInteger型などと同じデータの型です。

VB6でAs Anyとして宣言しているパラメータは、
第二パラメータに指定するもの(本件の例ではWM_GETTEXT)によって、
文字列型だったり整数型だったり、扱うデータが変わるための対応です。

WindowsAPIをVB.netで扱う方法は以下を参考にしてください。
「GetPrivateProfileStringにみるAPIの使用方法」
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html
2006/02/16(Thu) 12:30:30 編集(投稿者)

返信くだしましてありがとうございました。

じゃんぬねっと様
説明不足がありまして申し訳ありませんでした。
IEのアドレス欄にある文字列の取得

花ちゃん様
文字列は ByVal lParam As StringでSendMessage関数をそのまま使用させてもらいました。

よねKEN 様
StringBuilder・String・Integerは同じ仲間のデータの型でVB6かNETによることがわかりました。
それによりAPI関数の区別もつきました。

SendMessageで長い間つまずいていましたが投稿後、解決できれば動作することがわかりました。
ありがとうございました。

(訂正しました14時05分)
現在は、SendMessage関数でモジュールのメソッドを’Shared’として宣言できません。
名前’SendMessage’は宣言されていませんとなりす。

プログラム名_bas.vb・プログラム名_frm.vbありますがSendMessage関数は
プログラム名_bas.vb側に入れています。
2006/02/16(Thu) 12:31:39 編集(投稿者)

何度も申し訳ありません。

現在は
SendMessage関数でモジュールのメソッドを’Shared’として宣言できません。

SendMessage(child, WM_GETTEXT, Len(txt), txt)の所で
名前’SendMessage’は宣言されていませんとなりす。

<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


IEのアドレス欄にある文字列の取得
SendMessage関数はプログラム名_bas.vb・プログラム名_frm.vbありますが
プログラム名_bas.vb側に入れていますが設定場所に問題があるのでしょうか。
Sharedキーワードがどんな意味を持つかわからないからわからないんでしょう。
調べていないから1歩も先には進めないんでしょう。
『できませんでした』だけを書いているだけだとこう思われます。

検索のコツということで指示しておきましょう。
http://www.google.co.jp/search?hl=ja&q=MSDN+Shared+%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89&lr=lang_ja
2006/02/17(Fri) 09:04:05 編集(投稿者)

はいこーん様
返信くだしましてありがとうございました。

Sharedにつきましてはモジュールのメソッドを’Shared’として宣言できません。
となりましたのでF1キーで調べますとこのエラーを解決するには指定子を削除します。
とありましたので’Shared’部分を削除しました。すると今度は名前’SendMessage’は
宣言されていませんとなりました。結果しか記述していませんが、.NETを始めたこともあり
また基本的な文字列を表す.NETのデータ型も分からない状態ですので全く意味の無い
ことまでいろいろと行っている状態です。その点をご了承下さい。
まずは、クラスとモジュールの違い、Public,Private,Sharedの違いについて調べてみてください。
前者は概念的な違いですし、後者は呼べる呼べないの違いです。
察するに、できればコンバートソースと格闘するより、まず.NETそのもを習得したほうがよい思われます。
まどか様
返信くだしましてありがとうございました。
そうですね最も基本的なクラスとモジュール等の.NETそのもを習得しないと
駄目ですね。VB6.0からVB.NET2005にアップグレード後、エラーが13個ありましたが
なんとか最後の1個が、しかし多数の方のアドバイスを頂き問題点が絞れてきました。
今は似た様なサンプルプログラムを探して、基本的な事も学べればと思っています。
2006/02/16(Thu) 13:19:34 編集(投稿者)

同じ現象になるサンプルプログラムがありました。
http://dobon.net/vb/dotnet/control/tbgetcaretposition.html
これが動くようになれば解決出来るのではと望みがでてきました。

Form1.vb(フォーム内) 文字列・・・+  Button1 + TextBox1

Module1.vb(モジュール内) <System.Run・・+ EM_LINEINDEX ,EM_LINEFROMCHAR

エラーが5個発生しました。

Private Const EM_LINEINDEX As Integer = &HBB
Private Const EM_LINEFROMCHAR As Integer = &HC9
            ↓変更
            ↓
Public Const EM_LINEINDEX As Integer = &HBB
Public Const EM_LINEFROMCHAR As Integer = &HC9

エラーが3個になりました。

モジュールのメソッドを’Shared’として宣言できません。
名前’SendMessage’は宣言されていません。2個

そのままコピー&貼り付けするだけで動くと思っていましたが
何故発生のかわかりません。?
察するに、できればコンバートソースと格闘するより、まず.NETそのもを習得したほうがよい思われます。
2006/02/17(Fri) 09:07:42 編集(投稿者)

はいこーん 様
返信くだしましてありがとうございました

■15027 は解決いたしました。
 モジュールを削除して全てフォーム内に収めました。
 問題点は下記のみとなりました。

問題点 文字列を取得で@txtの所でString " " から型 'Integer' への変換は無効となります。
VB6では問題のない同じソースですが、そのようになるのがわかりません。解決方法はありますでしょうか。
Dim txt As String
txt = Space(255)                 @
Ret = SendMessage(child, &H0D , Len(txt), txt) 

■15027 の解決後、花ちゃんさんの 宣言されましたByVal lParam As Stringにより
解決することができました。皆様方のアドバイスして頂いたことに感謝致します。
ありがとうございました。
2006/02/17(Fri) 09:12:16 編集(投稿者)
■No15031に返信(arakiさんの記事)
> 2006/02/17(Fri) 06:24:34 編集(投稿者)
>
> はいこーん 様
> 返信くだしましてありがとうございました
>
> ■15027 は解決いたしました。
>  モジュールを削除して全てフォーム内に収めました。
>  問題点は下記のみとなりました。
>
> 問題点 文字列を取得で@txtの所でString " " から型 'Integer' への変換は無効となります。
> VB6では問題のない同じソースですが、そのようになるのがわかりません。解決方法はありますでしょうか。
> Dim txt As String
> txt = Space(255)                 @
> Ret = SendMessage(child, &H0D , Len(txt), txt) 
>
> ■15027 の解決後、花ちゃんさんの 宣言されましたByVal lParam As Stringにより
> 解決することができました。皆様方のアドバイスして頂いたことに感謝致します。
> ありがとうございました。
解決済み!

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