API「sendmessage」とHSP「sendmsg」
前回は「windows API」について簡単にみていきました。今回はHSP3の「sendmsg」についてみていきます。
| 【HSP3】 | 【windows API】 |
| sendmsg p1,p2,p3,p4 | sendmessage(p1,p2,p3,p4) |
前回、HSP命令の「sendmsg」は「windowsAPI」の1つである「sendmessage関数」を利用すると説明しました。
windows API:sendmessageは4つのパラメータをもちますが、HSP3:sendmsgも同様4つのパラメータを持ち、意味は全く同じです。
| p1 | HWND | 送信先ウィンドウのハンドル |
| p2 | UINT Msg | メッセージ |
| p3 | WPARAM wParam | メッセージの最初のパラメータ |
| p4 | LPARAM lParam | メッセージの 2 番目のパラメータ |
【例:ウィンドウタイトルを取得して表示】

ウィンドウタイトルを取得して表示する例をみながら、「sendmsg」の使い方をみていきます。HSP「sendmsg」のパラメータはwindows API「sendmessage」と全く同じでしたので、windowsAPI「sendmessage」からタイトルを取得するメッセージを探します。
「WM_GETTEXT」メッセージでタイトルが取得できそうです。マイクロソフトサイトの「WM_GETTEXT」メッセージの説明を引用します。
lResult = SendMessage( // returns LRESULT in lResult (HWND) hWndControl, // handle to destination control (UINT) WM_GETTEXT, // message ID (WPARAM) wParam, // = (WPARAM) () wParam; (LPARAM) lParam // = (LPARAM) () lParam; );
wParam
Specifies the maximum number of TCHARs to be copied, including the terminating null character.
確保する最大バイト数
確保する最大バイト数
lParam
Pointer to the buffer that is to receive the text.
テキストを受けてるバッファ領域のポインタ
テキストを受けてるバッファ領域のポインタ
指示されているとおりに、パラメータを指定します。
p1:
メッセージを送るウィンドウハンドルです。HSP3ではアクティブウィンドウの「ウィンドウハンドル値」はシステム変数「hwnd」で取得できます。
p2:
今回は定数「WM_GETTEXT」です。しかし、HSP3はsendmessageの定数は定義されていないので使えないようです。「ちょくとのページ」さんのメッセージリストには定数のコードも記載されていました。「WM_GETTEXT」は「0x000D」です。
p3:
確保する最大バイト数を指定します。
p4:
バッファー領域のポインタを指定します。変数を定義すればバッファーが確保されます。その変数のバッファーアドレス(ポインタ)は、「varptr関数」で求めることができます。
【HSP3例コード】
title "タイトル取得"
; 文字列確保領域(64バイト)
sdim buf
; WM_GETTEXT
sendmsg hwnd, 0x000D, 64, varptr(buf)
mes buf
title "タイトル取得"
; 文字列確保領域(64バイト)
sdim buf
; WM_GETTEXT
sendmsg hwnd, 0x000D, 64, varptr(buf)
mes buf
これで「sendmsg」を利用してウィンドウタイトルを取得し表示することができました。
2009 年 5 月 21 日 木曜日 【 カテゴリー: HSP3 , sendmsg 】


2009 年 5 月 25 日 11:23 PM
[...] API「sendmessage」とHSP「sendmsg」 [...]
2011 年 5 月 22 日 4:23 PM
初めまして。
以前、エクセルVBAを利用して他のプログラムを制御した時、「sendmessage」を使いました。
最近、HSPで実験したのですが、中々思うように制御できず、困っていたところ
ここを参考にしたら何とかできました。
(ウインドウズ付属の電卓の外部制御の実験です。)
助かりました。
エクセルVBAではapiの書式どおりSendMessage(hwd2,BM_CLICK,0,0)で
動作したのですが。hspではsendmsg hwd2, BM_CLICK, 0, 0となり
apiの書式とは異なるのですね?
あと、最初の「定義」(#cfuncや#defineの事)も
エクセルVBAとは、かなり異なり面食らっています。