メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.429) サムを監視する  2004/03/01


/*========================================================*/
    <<<あゆしゃの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

ブラウザの閉じるボタンで閉じてください。