|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第429回 サムを監視する 発行 2004年3月1日(月曜日) 発行数 約3200 {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンはまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・このメールマガジンは、横60文字で作成しています。 また、インデントはすべて半角スペース4つで構成しています。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、まぐまぐさんのホームページでお願いします。 ・まぐまぐさんのバックナンバー(下欄参照)を活用して下さい。 ・ここは私の復習の場です。内容は約1ヶ月内外に私が勉強した 内容になっています。最新の技術があれば、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは。あゆしゃです。 もう3月ですか、早いものです。 これから夏にかけて、鳥インフルエンザが猛威をふるい、日本人 が最悪で ★100万人死ぬだろうと、 週刊誌がぶっちゃけていますが、 マジな話、発症すれば死にますので、 ワクチンが完成する夏まで、風邪をひかないようにしましょう。 私は毎朝のうがい手洗いを、昨年の11月から欠かさないように しています。 ちなみに、80年前に同じような風邪が発生して、20万人が 死んだそうですから、100万人というのは人口の比率から打倒な 数値、なんだそうです。 {magclick} /*========================================================*/ 今回のお題 << サムを鳴らそう! >> /*========================================================*/ 前回までのあらすじ・・・ 先日、MSBSのログをつらつらと読んでいたときのことです。 読むのが面倒になりました。 そこで、勝手に呼んでくれるソフト、いわゆる音声再生ソフトに ついて、フリーのものを探したのですが、 良くわかりませんでした。 そのときに、ふと、気づいたのです。 WindowsXPにはサムという人が住んでいて、テキストを読んで くれます。 この標準の音声再生は、しかしただそれだけで、Wordなどの 文面を読むようなものではありません。 Microsoftのオプションなのだから、よんでくれてもいいじゃ ないですか、ねぇ? そしてこのサム君が読む文章というのは、テキストボックスに 入力したテキストのみなのです。 ファイルとかを指定するものではないのですね。 だから、文章全体を読ませるには、手作業しかありません。 /*========================================================*/ 面倒くさいです。 それをやるぐらいなら、サム君のウィンドウハンドルを捕まえ て、テキストを強制的に送りつけてやれば・・・ ・・・と思ったとき、それ、いいじゃん、と思いました。 /*========================================================*/ 本編 /*========================================================*/ 前々々回、サムのウィンドウをゲットできました。 前々回、サムにテキストを送りつけてみました。 そして前回、遠隔操作でサムのボタンを押しました。 今回は、再生中であるかどうかを監視してみようと思います。 再生中は、選択範囲が変わるので、キャレットを取得してそれが 変化しているかどうかで、再生中であるかどうかを判別できる、 でしょうか? やってみましょうか? CPoint pos = pWndText->GetCaretPos(); あらかじめ選択位置を先頭ではない場所にして実行してみると、 うーん、何も変わりませんでした。 キャレットは編集位置だと思っていたのですが、違うので しょうか。 では、CRichEditCtrlで編集位置を取得してみましょう。 CRichEditCtrl* pRich = ( CRichEditCtrl* )pWndText; long a, b; pRich->GetSel( a, b ); これをやったら、サムが強制終了されました。 あいた〜。 aとbがローカルメモリだったから、そこに格納しようとした サムが怒られてしまったのでしょうか? では、これをグローバルメモリにして見ましょう。 HANDLE hA = ::GlobalAlloc( GHND, sizeof( long ) ); HANDLE hB = ::GlobalAlloc( GHND, sizeof( long ) ); LPVOID pA = ::GlobalLock( hA ); LPVOID pB = ::GlobalLock( hB ); long* pa = ( long* )pA; long* pb = ( long* )pB; pRich->GetSel( *pa, *pb ); ::GlobalUnlock( hA ); ::GlobalUnlock( hB ); ::GlobalFree( hA ); ::GlobalFree( hB ); あちゃ、やっぱり強制終了でした。面倒な手順を踏んだのに。 CRichEditCtrlを使っては、駄目ですね。 (あれ? ロックを解除してからGetSelかな? まぁ、いいや) /*========================================================*/ ひょっとして、スパイにはRichと表示されていましたが、実は CEditだったり? そぉんな、ねぇ? CEdit* pEdit = ( CEdit* )pWndText; int a, b; pEdit->GetSel( a, b ); あ、成功しました。 なんだ、普通のCEditじゃないですか! だれですか、リッチだなんて嘘つく人は!! /*========================================================*/ ボタンを押した後、ループをはって見張りましょう。 CEdit* pEdit = ( CEdit* )pWndText; int a, b; pEdit->GetSel( a, b ); ::SendMessage( pWndDialog->m_hWnd, WM_COMMAND, pWndDone->GetDlgCtrlID(), ( LPARAM )pWndDone->m_hWnd ); HWND hText = pWndText->m_hWnd; TRACE( "%d,%d\n", a, b ); for( int i = 0; i < 10; i++ ) { int c, d; CEdit* pEdit2 = ( CEdit* )CWnd::FromHandle( hText ); pEdit->GetSel( c, d ); if( a != c || b != d ) { TRACE( "%d,%d\n", c, d ); a = c, b = d; } } あれ、何も変わりませんでした。 再生中にテキストボックスをマウスでたたくと選択が解除される ので、選択を使って色を変えているはずなのですが、 ・・・しまった、スリープを入れ忘れたんだ・・・ ::Sleep( 400 ); ループの最後にこれを入れて、「時間を置いて!」実行すると、 ちゃんと変わりますよ、えっへん。 {magclick} /*========================================================*/ さいごに /*========================================================*/ 思えば、前に作ったカットスペースのようなもので改行を削除 してから貼り付ければ、いいのではないでしょうか? そうですよね、1行ずつ送っては終了するのを監視する、という ことではなく、 最初からバーン! と設定すればいいのですよね。 しまった、夢中になっていて、基本的なところに気がつきません でした。 いやはや、まいったまいった。 {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は3月3日(水曜日)に、第430回を送ります。 お題は「平方根のアルゴリズム」 あれが去りましたので、再び週3回ペースに戻ります。 そして私はAYGONやGIBSをやりたいのですが、なんだか気分は 別の方向へ向かっています。 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されていますか? このメールマガジンの内容に文面の引用はありませんか? めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容の、転用、流用、宣伝、リンク、 ウイルスに選ばれし者 なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ まぐまぐアイディー 0000020674 まぐまぐバックナンバー http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ 登録と解除 http://www.mag2.com/m/0000020674.htm ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp めーらっくす <<過去ログがタイトル別になっています>> http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F |