C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■96409 / 3階層)  SendMessageの使用法
□投稿者/ 魔界の仮面弁士 (2921回)-(2020/11/20(Fri) 16:28:26)
No96407 (初心者 さん) に返信
> MSSpy++は持ち合わせていので、WinSpy++(フリー)にて判ったことは、(Textboxか判断できませんが)

WinSpy++ であれば、Class タブの Class Name を確認してみてください。
それが "Edit" か "Static" になっていれば、WM_GETTEXT で取得できると思います。
(ただし Static であっても、画像コントロールの場合は文字列を得られません)

General タブの Caption で読み書きできるのであれば、たぶん大丈夫じゃないかな…?


> 何方か、BricsCAD(体験版)をインストールして頂き、
> 解明してもらえないでしょうか。

ダウンロードにアカウント登録が必要なんですね。

私が協力できるかはお約束できないのですが、仮にそれをインストールした人が居たとしても、
そのアプリのどの画面のどの項目の値を取得したいのかが分からないと、
協力者が解析できないかもしれません。

すぐに分かるような項目なのであれば良いですが、分かりにくそうであれば、取得したい場所の画面を撮影し、
それを見られる URL (たとえば OneDrive の公開フォルダーなど)を貼った方が良いかも。



> 目的は、入力されてコマンド文字列の取得です。

画面を見たことが無いので分かりませんが、VB6 で言うところの
イミディエイト ウィンドウのようなものですかね?


> 問題点2(文法そのものに問題があり)
> APIの定義はこんな感じです。ネットから引っ張り出して、最終的にこうなりました。

Windows 9x 系が駆逐された今となっては、SendMessageA などの ANSI 系関数を呼び出すメリットは殆どありません。
基本的には、SendMessageW などの Unicode バージョンを前提にするか、Auto 指定にすることをお奨めします。

といっても、ANSI 系が廃止されたわけでは無いので、〜A 系関数のままでも一応動作します。
Shift_JIS に無い文字とかは化けてしまいますけれどね。


> Public Declare Function SendMessageString Lib "User32.dll" Alias "SendMessageA" (ByVal hWnd As Int32, _
>  ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As String) As Int32

本来 IntPtr 型にすべき場所が、Int32 型になっているようですね。
正しい呼び出し方ではありませんが、x86 ビルドでコンパイルすれば、Int32 型のままでも一応大丈夫です。
あるいは AnyCPU ビルドでも、32bit 優先ビルドなら OK。


HWND 型、WPARAM 型 ⇒ Win16 では 16bit、Win32 では 32bit、Win64 では 64bit
https://www.wdic.org/w/TECH/HWND
https://www.wdic.org/w/TECH/WPARAM

LPARAM 型 ⇒ Win16 と Win32 では 32bit、Win64 では 64bit 
https://www.wdic.org/w/TECH/LPARAM



>>ウィンドウレスコントロールが対象の場合には、SendMessage では受け取れないので、
>>UI オートメーションなどを使って値を取得する必要があるかもしれません。
> ??

たとえば、Excel VBA のユーザーフォームに対して貼ったテキストボックスは
ウィンドウレス コントロールです。こうしたコントロールは HWND を持たないため(フォームにはある)、
SendMessage で操作できません。

WinSpy++ 等でハンドルの存在を確認できているなら OK です。
ただしそれが WM_GETTEXT 対応なウィンドウであるかは別の話。


>>> オーバーロードを使わずに別名関数として API を宣言している点も、.NET っぽくないですし。
> オーバーロードの用法は分かりませんが、

引数定義だけが異なる同名の Function (あるいは Sub) を複数用意することをオーバーロードと言います。

正しく呼び出せるなら、VB6 っぽいコードのままでも問題はないのですが、それでも
API を使うファイルだけでも、「Option Strict On」にしておいた方が安全だとは思います。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[2]: SendMessageの使用法 /初心者 →Re[4]: SendMessageの使用法 /初心者
 
上記関連ツリー

SendMessageの使用法 / 初心者 (20/11/19(Thu) 18:50) #96397
Re[1]: SendMessageの使用法 / Hongliang (20/11/19(Thu) 20:03) #96400
Re[1]: SendMessageの使用法 / 魔界の仮面弁士 (20/11/19(Thu) 20:09) #96403
  └ Re[2]: SendMessageの使用法 / 初心者 (20/11/20(Fri) 12:35) #96407
    └ SendMessageの使用法 / 魔界の仮面弁士 (20/11/20(Fri) 16:28) #96409 ←Now
      └ Re[4]: SendMessageの使用法 / 初心者 (20/11/21(Sat) 11:39) #96414
        └ Re[5]: SendMessageの使用法 / Azulean (20/11/21(Sat) 17:57) #96415
          └ Re[6]: SendMessageの使用法 / 初心者 (20/11/23(Mon) 15:02) #96442

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信