C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[19]: Keys列挙体からChar文字


(過去ログ 89 を表示中)

[トピック内 20 記事 (1 - 20 表示)]  << 0 >>

■52714 / inTopicNo.1)  Keys列挙体からChar文字
  
□投稿者/ SS (5回)-(2010/08/23(Mon) 11:13:44)

分類:[C#] 

VS2008 C# Framework3.5
Windows Vista/7
 

お世話になります。
 
ProcessCmdKeyイベントの第二パラメータの Keys列挙体 から、
Char型を求める方法はあるでしょうか?
 
とりあえず、BackSpace,Tab,Enter,
A-Z,0-9(テンキー以外) であればダイレクトキャストでも
行けそうではありますが、厳密には違いますよね。
Modifier(Shift,Alt,Ctrl) の絡みもありますし…。
 
KeyPressイベントの KeyPressEventArgs では、
キーに対応したChar型が取れるので、
キーコードからキャラクタを取得する何らかの取得方法が
Framework 上で用意されてると(勝手に)思ったのですが、
探し方が悪いのかヘルプでもネットでも見つけられませんでした。
 
最終的には、キーコードからCharのアスキーコード(Unicode?)が
分かれば良いと考えております。
 
キーに対応するCharの対応表のような物を自作しようとも思いましたが、
キーボードの種類(英語キーボード/日本語キーボード 等)によっても
変わると思いますし、現実的ではないのかなぁ…と憂慮しております。
 
キーコードの数値から計算等で求められる公式など存在するのでしょうか?
そもそも、Framework で機能として用意されているのでしょうか?
更にそもそも、Keys列挙体からCharの変換などナンセンスなのでしょうか?
 

話が前後しましたが、やりたいことは、
フォーム上のどのコントロールがアクティブであろうと、
ある決められた Char文字 がそのフォーム上で入力されたら、
ある決められた処理を行いたい。 です。
 

よろしくお願いします。
引用返信 編集キー/
■52717 / inTopicNo.2)  Re[1]: Keys列挙体からChar文字
□投稿者/ よねKEN (574回)-(2010/08/23(Mon) 12:02:45)
よねKEN さんの Web サイト
No52714 (SS さん) に返信
> ProcessCmdKeyイベントの第二パラメータの Keys列挙体 から、
> Char型を求める方法はあるでしょうか?

何のためにControl.ProcessCmdKeyメソッドをオーバライドしているのでしょう?
Control.ProcessDialogCharメソッドではダメでしょうか?
#Process〜メソッドの呼び出される順序やそれぞれのメソッドの役割を
#私は正しく理解していないので、妥当な手段かどうかはちょっとわかりませんが。
#おかしなことを言っていたら、どなたかフォローお願いしますm(_ _)m
引用返信 編集キー/
■52719 / inTopicNo.3)  Re[2]: Keys列挙体からChar文字
□投稿者/ SS (6回)-(2010/08/23(Mon) 12:29:20)
No52717 (よねKEN さん) に返信
>
> 何のためにControl.ProcessCmdKeyメソッドをオーバライドしているのでしょう?
> Control.ProcessDialogCharメソッドではダメでしょうか?
> #Process〜メソッドの呼び出される順序やそれぞれのメソッドの役割を
> #私は正しく理解していないので、妥当な手段かどうかはちょっとわかりませんが。
> #おかしなことを言っていたら、どなたかフォローお願いしますm(_ _)m

よねKEN さん 早速の返信ありがとうございます。

恥ずかしながら、ProcessDialogChar を知りませんでした。

ProcessCmdKey は、主に F10キー に意味を持たせたくて使っていて、
KeyDown や KeyPress よりも先にキー判定する方法を探していて知りました。
が、その時には ProcessDialogChar は見つけられませんでした。

ProcessDialogChar で用件を満たせるかどうか色々試してみます。
またご報告させていただきます。
引用返信 編集キー/
■52724 / inTopicNo.4)  Re[3]: Keys列挙体からChar文字
□投稿者/ SS (7回)-(2010/08/23(Mon) 14:30:16)
No52719 自己レス
> ProcessDialogChar で用件を満たせるかどうか色々試してみます。
> またご報告させていただきます。
 
ProcessDialogChar 試してみました。
ヘルプ(リファレンス?)を読んだ時からアレ?とは思いましたが、
実際やってみて なんとなくですが分かりました。

どうやら ProcessDialogChar は、ショートカットキーの様なキー入力
の場合にしか反応しないようです。(Alt + Anyキー)
まだ正しく理解できていないかもしれませんが、
もしこのような仕様でしたら、やりたい事は出来そうにありません。

引用返信 編集キー/
■52732 / inTopicNo.5)  Re[4]: Keys列挙体からChar文字
□投稿者/ Hongliang (689回)-(2010/08/23(Mon) 17:46:44)
> そもそも、Framework で機能として用意されているのでしょうか?
むしろ OS が用意しています。TranslateMessage 関数です。しかしこれは、恐らく SS さんが望む機能ではありません。WM_KEYDOWN を渡したら対応する WM_CHAR をメッセージキューに追加するってな関数ですから、メッセージループを自分で書く場合以外は呼び出すことのない物です。

> 更にそもそも、Keys列挙体からCharの変換などナンセンスなのでしょうか?
修飾キーや、果ては IME からの入力の事なども考えると現実的ではないと思います。

KeyPreview していれば、基本的に Form の KeyPress イベントでそのフォームに対する文字入力イベントは全て取れます。ただし ActiveX コントロール(WebBrowser とか)にフォーカスが当たっている場合、入力はそちらが奪ってしまう可能性があります。

// 個人的には、キーではなく文字で判断ってのがピンと来ません。
引用返信 編集キー/
■52733 / inTopicNo.6)  Re[5]: Keys列挙体からChar文字
□投稿者/ Hongliang (690回)-(2010/08/23(Mon) 18:09:03)
忘れてた。
IFilterMessage インターフェイスを実装すれば、アプリケーションで発生する WM_CHAR を全てフィルタリングすることが可能のはずです。
引用返信 編集キー/
■52740 / inTopicNo.7)  Re[6]: Keys列挙体からChar文字
□投稿者/ SS (8回)-(2010/08/23(Mon) 20:40:39)
No52732 (Hongliang さん) に返信
No52733 (Hongliang さん) に返信

Hongliang さん 返信ありがとうございます。
 
TranslateMessage 関数
IFilterMessage インターフェイス
 
また知らない単語が出てきましたw(汗
すいません、今色々試せる環境ではないので後日また
調べて試してみたいと思います。

またご報告させていただきます。
引用返信 編集キー/
■52743 / inTopicNo.8)  Re[7]: Keys列挙体からChar文字
□投稿者/ Hongliang (691回)-(2010/08/23(Mon) 21:09:52)
2010/08/23(Mon) 21:10:43 編集(投稿者)

あ、すいません、IFilterMessage じゃなくて IMessageFilter でした。
// このインターフェイスが定義するメソッドが PreFilterMessage なので、どうもうっかりごっちゃになります。

それと、TranslateMessage は取り敢えず忘れても構わない程度の話です。
引用返信 編集キー/
■52761 / inTopicNo.9)  Re[8]: Keys列挙体からChar文字
□投稿者/ タスク (5回)-(2010/08/24(Tue) 10:35:31)
問題点が理解できないです。

素人理解ですが、キーボードのドライバの段階で吸収されて
いるキーボード上の表示(配置?)を取得しようとしている?
それ、ドライバがそのような要求に対応する機能を持って
ないと無理だったりしないんですか?

引用返信 編集キー/
■52770 / inTopicNo.10)  Re[9]: Keys列挙体からChar文字
□投稿者/ SS (9回)-(2010/08/24(Tue) 12:06:46)
No52743 (Hongliang さん) に返信

すいません、まだ IMessageFilter を実装してみた訳ではないのですが、
これって、結局はキャラクタコードの取得はできないんでしょうか?
Message.xxx のどれかに持ってたりするんでしょうか?
的外れなことを言ってたらすいません。


No52761 (タスク さん) に返信
> 問題点が理解できないです。
>
> 素人理解ですが、キーボードのドライバの段階で吸収されて
> いるキーボード上の表示(配置?)を取得しようとしている?
> それ、ドライバがそのような要求に対応する機能を持って
> ないと無理だったりしないんですか?
>
タスク さん 返信ありがとうございます。

あー、そこまでの話になってしまうんでしょうか?
Hongliang さんも
> むしろ OS が用意しています。
って言ってますし…。

すいません、
結局のところ、フォームの KeyDown でも KeyPress でも、
ProcessCmdKey でも IMessageFilter でも何でも良いんです。
フォーム上で、どのキャラクタが入力されたかが判定できれば。

だた、フォーム上のどのコントロールがアクティブであっても、
IME の入力途中であっても、
いかなる場合でも優先して 特定のキャラクタ の入力が判定できれば…。

と言う事なんです。
やっぱり無理なんでしょうかね…。
引用返信 編集キー/
■52775 / inTopicNo.11)  Re[10]: Keys列挙体からChar文字
□投稿者/ Hongliang (692回)-(2010/08/24(Tue) 12:30:59)
> すいません、まだ IMessageFilter を実装してみた訳ではないのですが、
> これって、結局はキャラクタコードの取得はできないんでしょうか?
WM_CHAR の解説を読んで下さい。

> だた、フォーム上のどのコントロールがアクティブであっても、
> IME の入力途中であっても、
> いかなる場合でも優先して 特定のキャラクタ の入力が判定できれば…。
IME の入力中はそもそも文字の入力は存在していません。変換が確定したときに初めて、入力される文字が確定するからです。
例えばローマ字入力中、「k」「a」とキー入力したからと言って、入力される文字が「か」なのか「カ」なのか「化」なのかは「a」を押した時点では分からないと言うことです。
引用返信 編集キー/
■52785 / inTopicNo.12)  Re[11]: Keys列挙体からChar文字
□投稿者/ SS (10回)-(2010/08/24(Tue) 15:13:29)
No52775 (Hongliang さん) に返信
>>すいません、まだ IMessageFilter を実装してみた訳ではないのですが、
>>これって、結局はキャラクタコードの取得はできないんでしょうか?
> WM_CHAR の解説を読んで下さい。
>
>>だた、フォーム上のどのコントロールがアクティブであっても、
>>IME の入力途中であっても、
>>いかなる場合でも優先して 特定のキャラクタ の入力が判定できれば…。
> IME の入力中はそもそも文字の入力は存在していません。変換が確定したときに初めて、入力される文字が確定するからです。
> 例えばローマ字入力中、「k」「a」とキー入力したからと言って、入力される文字が「か」なのか「カ」なのか「化」なのかは「a」を押した時点では分からないと言うことです。
 
実装してみました。
というか、実装したクラスを別途用意して、
実際に使いたいフォームに AddMessageFilter しましたけど…。
使い方はこれで良いのでしょうか?
自フォームに直接実装って出来るんでしょうか?
(あ、また変な事言ってますか?)

これで、とりあえずキャラクタの取得の方法は分かりました。

IME の入力中は、ImmGetVirtualKey を使おうと…思いま…す。 ←自信無し(汗

もう少し色々試してみます。
また分からないことが出てきたら質問させてください。

ありがとうございました。
引用返信 編集キー/
■52786 / inTopicNo.13)  Re[12]: Keys列挙体からChar文字
□投稿者/ Hongliang (693回)-(2010/08/24(Tue) 15:23:10)
> というか、実装したクラスを別途用意して、
> 実際に使いたいフォームに AddMessageFilter しましたけど…。
> 使い方はこれで良いのでしょうか?
> 自フォームに直接実装って出来るんでしょうか?
別にどこに実装させても構いませんよ。対象の Form に実装させるのが楽なことも多いでしょう。

> IME の入力中は、ImmGetVirtualKey を使おうと…思いま…す。 ←自信無し(汗
結局、その場合取得できるのはキー入力であって文字入力ではありません。
そこでキー入力で妥協するのなら、他もキー入力で良いのでは、という話になりますが。
引用返信 編集キー/
■52793 / inTopicNo.14)  Re[13]: Keys列挙体からChar文字
□投稿者/ SS (11回)-(2010/08/24(Tue) 16:30:08)
No52786 (Hongliang さん) に返信
>>というか、実装したクラスを別途用意して、
>>実際に使いたいフォームに AddMessageFilter しましたけど…。
>>使い方はこれで良いのでしょうか?
>>自フォームに直接実装って出来るんでしょうか?
> 別にどこに実装させても構いませんよ。対象の Form に実装させるのが楽なことも多いでしょう。

もう少し実装方法を調べますっ。


>>IME の入力中は、ImmGetVirtualKey を使おうと…思いま…す。 ←自信無し(汗
> 結局、その場合取得できるのはキー入力であって文字入力ではありません。
> そこでキー入力で妥協するのなら、他もキー入力で良いのでは、という話になりますが。

そうですよね! キャラでなければいけないんでした… orz
思えば、だから キーコード→キャラコード 変換出来ないか? と思った次第で…。
んー、どうしましょう?

ちなみに、現時点で以下のような順番に処理が走ってます。
1. ProcessCmdKey
2. IMessageFilter
3. Form_KeyPress
こういうもんなんでしょうか?
引用返信 編集キー/
■52801 / inTopicNo.15)  Re[14]: Keys列挙体からChar文字
□投稿者/ Hongliang (694回)-(2010/08/24(Tue) 17:53:14)
> ちなみに、現時点で以下のような順番に処理が走ってます。
> 1. ProcessCmdKey
> 2. IMessageFilter
> 3. Form_KeyPress
> こういうもんなんでしょうか?
キーボードからの入力によるメッセージは一般に WM_KEYDOWN → WM_CHAR の順で発生します。
ProcessCmdKey は WM_KEYDOWN を受けたときに呼び出されます。
IMessageFilter は WM_KEYDOWN および WM_CHAR いずれでも呼び出されますが、多分あらゆる入力系処理(各種メソッドやイベント)の中で最も早く呼び出されます。
KeyPress は WM_CHAR を表すマネージイベントです。

> そうですよね! キャラでなければいけないんでした… orz
> 思えば、だから キーコード→キャラコード 変換出来ないか? と思った次第で…。
> んー、どうしましょう?
そもそも、私が以前
> IME の入力中はそもそも文字の入力は存在していません。変換が確定したときに初めて、入力される文字が確定するからです。
> 例えばローマ字入力中、「k」「a」とキー入力したからと言って、入力される文字が「か」なのか「カ」なのか「化」なのかは「a」を押した時点では分からないと言うことです。
と書いたように、IME 入力中に文字もなにもないわけですが。
なぜ「文字」にこだわるんでしょうか?
引用返信 編集キー/
■52805 / inTopicNo.16)  Re[15]: Keys列挙体からChar文字
□投稿者/ 魔界の仮面弁士 (1768回)-(2010/08/24(Tue) 18:12:13)
No52801 (Hongliang さん) に返信
>>例えばローマ字入力中、「k」「a」とキー入力したからと言って、入力される文字が「か」なのか「カ」なのか「化」なのかは「a」を押した時点では分からないと言うことです。
> と書いたように、IME 入力中に文字もなにもないわけですが。
> なぜ「文字」にこだわるんでしょうか?

極端な話、キー入力が一切無い状態で文字が入力される事も珍しくありませんので、
もしも文字にこだわるなら、それをキー入力だけから拾おうとするのは充分では無いと思います。

マウスからの貼り付けや、ペン入力という選択肢もありますし。
引用返信 編集キー/
■52812 / inTopicNo.17)  Re[16]: Keys列挙体からChar文字
□投稿者/ SS (12回)-(2010/08/24(Tue) 19:12:26)
No52801 (Hongliang さん) に返信
No52805 (魔界の仮面弁士 さん) に返信

> >>例えばローマ字入力中、「k」「a」とキー入力したからと言って、入力される文字が「か」なのか「カ」なのか「化」なのかは「a」を押した時点では分からないと言うことです。
>>と書いたように、IME 入力中に文字もなにもないわけですが。
>>なぜ「文字」にこだわるんでしょうか?
>
> 極端な話、キー入力が一切無い状態で文字が入力される事も珍しくありませんので、
> もしも文字にこだわるなら、それをキー入力だけから拾おうとするのは充分では無いと思います。
>
> マウスからの貼り付けや、ペン入力という選択肢もありますし。

魔界の仮面弁士 さん 返信ありがとうございます。

えーと…、正直に白状したほうが良さそうですねw
実は想定している入力デバイスは、キーボードではありません。
ピンと来る方もいらっしゃると思いますが、バーコードリーダーです。

で、これには、始端文字(と終端文字)が割り当てられておりまして、
何においてもこの 始端文字 が入力されたら優先して
「バーコードの入力が始まるぞっ」
と認識させたかった訳です。 IME入力中でもです。
 
ですんで、IME入力中の 例えば 「か」 だったら 「k」 とか 「a」 が 分かれば良かったんです。
「か」 が分かる必要はありませんでした。
 
コピぺ 等 は考えていませんでしたが…。
引用返信 編集キー/
■52823 / inTopicNo.18)  Re[17]: Keys列挙体からChar文字
□投稿者/ 魔界の仮面弁士 (1773回)-(2010/08/24(Tue) 21:31:50)
No52812 (SS さん) に返信
> 実は想定している入力デバイスは、キーボードではありません。
> ピンと来る方もいらっしゃると思いますが、バーコードリーダーです。

そのバーコードリーダーは、スキャン結果がキーボード入力として
PC に送信されるタイプの製品なのでしょうか?

フォーカス位置に関係なく拾いたいなら、キーボードインターフェイスではなく、
RS-232C入力や USB+専用ドライバなどで処理できる製品を採用した方が良いと思います。
引用返信 編集キー/
■52827 / inTopicNo.19)  Re[18]: Keys列挙体からChar文字
□投稿者/ SS (13回)-(2010/08/25(Wed) 01:40:18)
No52823 (魔界の仮面弁士 さん) に返信

> そのバーコードリーダーは、スキャン結果がキーボード入力として
> PC に送信されるタイプの製品なのでしょうか?

そうです。
と言うか、バーコードリーダーと言えばそういうもんだと思ってました(汗

> フォーカス位置に関係なく拾いたいなら、キーボードインターフェイスではなく、
> RS-232C入力や USB+専用ドライバなどで処理できる製品を採用した方が良いと思います。

一応、現在テストに使用している物は、USB接続です。
ドライバはありません。 ドライバは無くても認識し、入力も行える物です。

専用ドライバ てのはちょっと怖いですね…。
将来的に、買い足した新型機?に対応出来ない とか、
今現在の資産+今回買い足し とか、
新型/旧型 とか メーカー違い とか が混在する可能性を言ってしまうと…。

 
しかしまぁ、無理なものは無理 と言う事であれば、せめて
 「IMEの入力中は出来ません」
でも通るような気もします…w
(そもそも、IME 入力中でも反応するように。 てのが一般的なのかどうか…?)
引用返信 編集キー/
■52872 / inTopicNo.20)  Re[19]: Keys列挙体からChar文字
 
□投稿者/ SS (14回)-(2010/08/26(Thu) 12:22:00)
No52827 自己レス

色々お騒がせしました。
結局のところ、IME入力中は対応しなくても良い という事で落ち着きました。
 

回答してくださった皆さん、
本当にありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -