ティアのたわごと3☆其の308 |
日本人的感覚のなせる技 |
---|
プログラムな中身ですが、プログラミングのことではありません。
あたしが作っているプログラムはWindows用なので、ウィンドウズを使ったことのない人は若干分からないかもしれませんが・・・・・・
Windowsってば、文字を打つときに、マウスとかでクリックして、キーボードを打つと文字が入ったりしますよね。
それを、プログラムで組むために四苦八苦したこと10日あまり(笑
当然と言えば当然ですが、文字を入力するときは、そこ一カ所しか入りませんよね、
これを”入力フォーカス”といいますが、逆に言うと「入力フォーカス」を持っていれば、文字が打てるってことです。
プログラムを作るときはこの入力フォーカスの奪い合いになります。
問題はこの奪い方☆
とりあえず今までやったことがなかったのでいろいろ調べた結果、GetFocusってそのままの命令を発見☆ミ
早速使ってみるも、文字の入力は全く関係のないところでされて、「入力フォーカス」の奪取に失敗
ここからが、あたしの戦いの日々でした。
試しにいろんな形で作り直してみました。
とりあえず、Windowsの標準テキストボックス
を作ってみると、これにはちゃんと入力が出来る。
ってことは、これは「入力フォーカス」が持ててる。
じゃぁ、ってことで、ここから「入力フォーカス」を移動して・・・とか、あっちにしてとか色々やっている内に、やっと入力成功。
ぐちゃぐちゃになったプログラムを整えると、またしても文字が入力できない。
表示されていないだけかなと思い、実行中のメモリを見てみると、全く入っていない(笑
要するに「入力フォーカス」は取れていなかったってことになります。
なにかの偶然で、たまたま文字が表示されただけのようです。
そのあと、MicrosoftAccessibirity?なるものが見つかり、カラットをセットして文字を入力するとか書いてあったので、このカラットを頑張って表示をさせてみる物の全然ダメ
よくよく見てみると、入力位置に表示してくださいって書いてあり、勝手に点滅する棒を出すだけでした。
なので、次の手
次の手と行っても、なかなか出てくるものでもなく、いろいろ調べ歩いて数日・・・やっぱりGetForcusとかSetForcusとかで設定するらしいことは分かりました。
でも、何をやってもダメ(笑
ッてことは、表示している枠の方の問題?
そうです、今度こそ当たりです!
Windowsは枠を表示するのにメッセージループって謎な装置がいります。
良く読むと、スレッド(同時実行数)毎にメッセージループとカラット、入力フォーカスがあるとか書いてあるではないですか!
ってことは、スレッドを2にすれば2カ所で入力が出来る?
なので、実際に入力がしたい枠を移して・・・・
やっぱりダメでした。
調べて見ると、Windowsの標準コントロール(テキストボックスなど)を表示してもスレッドは1のままなので・・・標準コントロールと、あたしが表示した枠の違い・・・・
同じモジュール(実行ファイル)にある。
それ以外の枠の条件は全て共通にしたのですから、これですよね。
単にスレッドを2にするだけでなく、モジュールも分けた方が良かったんですよ
もう、完璧☆ミ
これで動かなかったら泣いちゃう!
2日間泣きました・・・・
さて・・・・泣き続けると頭は重くなるもの、ぐったりとしたまま、他の手を探しました。
スレッドが1こだと言うことは、スレッドが2に増えた後、1に戻す作業をしているのかもしれない
そんなことの出来る命令は・・・・・
ありました(笑
もう、Windowsって、変な命令ばかり用意して・・・
この、SetWindowLongの命令で、処理する位置を変更できるとか☆
・・・・・・
あたし、浅はかでした、
処理する位置が移動するだけで、スレッド数は変わりませんでした。
万策つきたと思いつつも次の手を探し・・・
そう、1つのスレッドで受信する方法があったわ!
Windowsは他のプログラムの処理を監視する機能があったんです。
SetWindowsHookExを使えば、どこでキーボードが入力されたか一目瞭然!!
この辺りでは、文字を受け取ることしか考えてなかったため、当然実用に耐えられる物は作れませんでした。
そうです。必要なのは文字を受け取ることではなく「入力フォーカス」をあたしのウィンドウに移すことです。
この「入力フォーカス」さえあれば、こんな苦労せずとも文字は受け取れるのですから。
悩めること3日・・・たいして読めもしない英語の文献を百数十ページ読みあさり
出てくるのはいつもSetFocusとGetFocusの二つばかり
でも、これ使っても全然出来なかったし・・・・
えっ・・・・
SetFocus?
以前まぐれで入力できたときもこれを使っていたような・・・
(訳:あたし) |
どっちも、同じじゃん!
でも、同じのが何で二つもあるの?
あれ・・・・
(訳:あたし) |
そんな!
あたしってばか〜
こうして10日以上掛けたあたしの戦いは終わりました。
SetFocusは・・・たしかに、フォーカスを設定していると分かるけど・・でも「入力フォーカス」を取得したいんだから
GetFocusがいいと思ってたのよね
だって、「ポ○モンゲットだぜ!」とか言ってる人もいるし
ふつう、取りたいときはGetだよね!!
教訓:正しく和訳しましょう
☆ティア☆
2002/2/12