ab.com コミュニティ
https://www.activebasic.com/forum/

メモ帳から文字を読み取りたい
https://www.activebasic.com/forum/viewtopic.php?t=2374
ページ 11

作成者:  kobo [ 2008年5月04日(日) 22:41 ]
記事の件名:  メモ帳から文字を読み取りたい

皆様 はじめましてKoboと申します。
ABで組みだして2ヶ月くらいです。
過去N88時代にはよくプログラムを組んでいたのですが
Cに乗り遅れ、ポインタやら構造体やらを理解せずに来ました。
なんとなく理解はしてきてはいるのですが、
未だメモ帳から文字を拾得することすらままなりません。
昔は父と独学しておりましたが今は相談する父もなくなり、
私自身も歳を取り頭が固くなったせいか理解力も低下しております。
壁を乗り越えるか、頭皮を掻き破るのが先かという状態です。
前置きが長くなりましたが、下記コードと私に何が足りないのか
ご教授いただけないかと恥を忍んで投稿させていただきました。
何卒よろしくお願いします。

#N88BASIC

dim hwin as HWND,hcwin as HWND
dim pqr as *MSG

hwin=FindWindow("Notepad","無題 - メモ帳")
print hwin
hcwin=GetWindow(hwin,GW_CHILD)
print hcwin

GetMessage(pqr.message,hcwin,0,0)

print GetWord(pqr.message)

end

コンパイルすると
test3.abp(11) - "pqr" 参照方法が違います
test3.abp(13) - "pqr" 参照方法が違います
test3.abp(13) - "pqr.message" 無効な識別子です
となります。
おそらくMSG構造体の扱いと、GetMessage文の第一パラメーターの
理解ができていないからだと思うのですが
ヘルプと質問板を2週間毎日にらめっこしても解決の糸口すら
見つけることができません。

作成者:  7 [ 2008年5月05日(月) 00:44 ]
記事の件名:  Re: メモ帳から文字を読み取りたい

> #N88BASIC
>
> dim hwin as HWND,hcwin as HWND
> dim pqr as *MSG
>
> hwin=FindWindow("Notepad","無題 - メモ帳")
> print hwin
> hcwin=GetWindow(hwin,GW_CHILD)
> print hcwin
>
> GetMessage(pqr.message,hcwin,0,0)
>
> print GetWord(pqr.message)
>
> end
>
> コンパイルすると
> test3.abp(11) - "pqr" 参照方法が違います
> test3.abp(13) - "pqr" 参照方法が違います
> test3.abp(13) - "pqr.message" 無効な識別子です
> となります。
> おそらくMSG構造体の扱いと、GetMessage文の第一パラメーターの
> 理解ができていないからだと思うのですが
ただの構造体ならドット演算子を使って書いても良いんですけど、構造体ポインタはアロー演算子を使わなければなりません。
コード:
pqr->message
参照方法が違いますっていうのはここら辺で怒られてるんですね。

ウィンドウから文字列を取得するには、GetMessage()関数じゃなくてGetWindowText()関数を使います。

実際に動かしてませんが、これはどうでしょう?
コード:
#N88BASIC

dim hwin as HWND,hcwin as HWND
dim text as LPSTR
dim len as Long

hwin=FindWindow("Notepad","無題 - メモ帳")
print hwin
hcwin=GetWindow(hwin,GW_CHILD)
print hcwin

len=GetWindowTextLength(hcwin)+1
text=calloc(len)
GetWindowText(hcwin,text,len)

print text

free(text)

end 

作成者:  Kobo [ 2008年5月05日(月) 22:41 ]
記事の件名:  他アプリケーションのウィンドウ?

 7 様早速のご指導感謝いたします。
アロー演算子と言う物は初耳でした。今頑張って調べているとこです。
さて、賜りましたソースコードを実行してみた次第です。
「print text」で出力されるのは数値のみなのです。これ自体はポインタなのだろうと
「print GetWord(text)」としてみると出力されるのは決まった数値だけに
なってしました。アスキーコードでもなさそうです。

GetWindowTextLength で返ってくる値が「1」でした。
文で+1しているので実質「0」となっており、ヘルプから察するに長さの取得に
失敗しているものと理解しました。

GetWindowText 自体は色々なヘルプの回答から知識にはありましたが
解説文内に
「この関数は、WM_GETTEXTメッセージを使用してテキストを取得します。他のアプリケーションが所有するウィンドウのテキストは取得することができません。」
と、あり「メモ帳」が他のアプリケーションに当たるだろうと思い使用を避けておりました。
GetWindowTextLength の解説文にも同様の説明がありましたので、
それではないかと感じております。

別角度から理解を試みようと、「メモ帳」に文字を送ることは成功したのですが
関係のあるだろう文法を調べると、また元の文法に戻ってくると。
袋小路状態です。

①「メモ帳」は他のアプリケーションに当たるのでしょうか?
②上手く動かないことに対して、注目すべき点はあっているのでしょうか?

お時間があるときにご指導いただければと思います。
引き続き頭皮を削りつつ勉強しております。

作成者:  situmon [ 2008年5月06日(火) 15:05 ]
記事の件名: 

横から失礼します。

試してませんが、

GetWindowText(hcwin,text,len)

の行を

SendMessage(hcwin,EM_GETLINE, 0, text)

に変えて、

print text

の行を

print MakeStr(text)

とかに変えたら出来ませんか?

作成者:  7 [ 2008年5月06日(火) 16:33 ]
記事の件名:  Re: 他アプリケーションのウィンドウ?

> 「print text」で出力されるのは数値のみなのです。これ自体はポインタなのだろうと
> 「print GetWord(text)」としてみると出力されるのは決まった数値だけに
> なってしました。アスキーコードでもなさそうです。
あぁ、そうでした。printで出力するとポインタ自体(?)が表示されちゃうんですよね。
これはMakeStr関数を使ってString型に変換して表示します。

今度はちゃんと動かして確認しました。
コード:
dim hwin as HWND,hcwin as HWND
dim text as LPSTR
dim len as Long

hwin=FindWindow("Notepad","無題 - メモ帳")
print hwin
hcwin=GetWindow(hwin,GW_CHILD)
print hcwin

len=SendMessage(hcwin,WM_GETTEXTLENGTH,0,0)+1
text=calloc(len)
SendMessage(hcwin,WM_GETTEXT,len,text)

print MakeStr(text)

free(text)

end

作成者:  Kobo [ 2008年5月06日(火) 19:56 ]
記事の件名:  色々理解できました。

7 様 situmon様
無事に出力ができました。
できた瞬間には、壁が崩れた勢いと自分のアホさ加減に笑いがでました。
SendMessage文のSendの意味からウィンドウに文字を送るだけの文だと
思っていました。
また、WM_***はまだ知らない高度な命令文だと思っていました。
ヘルプにあった「wMsg メッセージ コードを指定します。」が「WM_***」だとは・・・
なにやら壁が10枚くらい一気に抜けた感じです。
MakeStr に関しても指摘された瞬間に「あー・・見たことある あれか!」と
GetWord にとらわれて考えがそちらに向きませんでした。

おそらくは、初歩の初歩の「Hello World」レベルに親切にお答え頂け
ありがたい気持ちで一杯です。頂きました1文1文が大きな勉強になりました。
いま、行き詰る時も出てきますでしょうが、袋小路に陥ったときは
Send~の時を思い出して頑張ります。
乱文駄文 失礼いたしました。

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/