お世話になります。
SDIアプリ作成過程で、リソースに新規挿入したダイアログに貼り付けた
エディットボックスでの入力を試すと、気付いている範囲では
'r'や'y'キーなどを押しても反応が無く、エディットボックスに文字が入りません。
それらのキーは何かシステム用に割り当てられていて?デフォルトでは
効かなくなっていたりするのでしょうか?的外れかもしれませんが・・・^^;
どうすれば普通に全てのキーが入力できますでしょうか?
どうか、ご教授下さい。よろしくお願い致します。
↑半角小文字の'r'と'y'などが反応無く、入りません。
半角の大文字や、全角日本語入力モードでは入りますが・・・
なぜなのでしょうか?ご助言下さい。
いつになったら、ここの最低マナー守ってくれるのかな
「発言される前に「使用上の注意」を必ずお読み下さい。」
これは「追加発言に限定」されるのではなく「新規質問」時も適用されます
質問内容の情報、少なすぎ!
多分、アクセラレータかフック系アプリに食われているのかも?
レスありがとうございます。
SDI(FormView)プログラムで、オーバーライドしましたPreTranslateMessage()関数
から飛ばした先で、インスタンスを生成してDoModal()したダイアログに貼り付けてある
エディットボックス内でキー入力をした時、半角小文字の'r'と'y'のみ反応無く
文字が入りません。親のFormView上に貼り付けたエディットボックスでの入力では
大丈夫なのですが・・・。今の自分には原因がちょっと見当つきません。
情報が不十分かもしれませんが・・・^^;引き続き、ご推察よろしくお願い致します。
はじめまして。
>'r'や'y'キーなどを押しても反応が無く、エディットボックスに文字が入りません。
他の文字が問題なく入力できるということなので、文字を入力したときに
発生するイベントを捕まえたりしていないのならばそのプログラム側には
問題ないと思います。おそらく他に原因があると思います。
レスありがとうございます。
そのエディットボックスを貼りつけてありますダイアログのクラスでも、いちお
PreTranslateMessage関数をオーバーライドしていまして、ファンクションキー押下を
拾うために、変かもしれませんが?下記のようなコードを追加してはいるのですが
問題の半角小文字の'r'と'y'キーなどは、捕まえていないはずですので?
このプログラム以外のところに原因があるとしたら、益々思いつきません。^^;
この関数で、とにかくエディットボックスで何のキーが押されたか全て知る方法は
ありますでしょうか?普通のアルファベットキーなどの場合は、pMsg->wParam内に
どんな(仮想?)キーコードが入っているのでしょうか?
今回どのようにアプローチすればよさそうでしょうか、ご助言ご推察お願い致します。
BOOL CDialog_input::PreTranslateMessage(MSG* pMsg)
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) {
if (pMsg->wParam == VK_F3)
EndDialog(VK_F3);
else if (pMsg->wParam == VK_F10)
EndDialog(VK_F10);
}
if (pMsg->wParam == VK_F3 || pMsg->wParam == VK_F10) {
UpdateData(TRUE);
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
なぜ「PreTranslateMessage」なの?
どこまでWM_KEYDOWN届いているかデバックできないの
デバッガの使い方知らないのなら、SPY++を使うことをお勧めします
RAPT さんの「アクセラレータ」は「オーバーライド」したことにより
自分でフィルタ処理してませんかということだと思います
MSDN一部引用
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Windows 関数 TranslateMessage や DispatchMessage にディスパッチされる前に、ウィ
ンドウ メッセージをフィルタ処理するには、この関数をオーバーライドします。既定の
実装では、アクセラレータ キーの変換を行います。そのため、オーバーライドした
CWinApp::PreTranslateMessage メンバ関数を呼び出す必要があります。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「アクセラレータ キーの変換を行います」ってどんなことしてるんでしょうな?
ちゃんとわかって使ってますよね
PreTranslateMessageの戻り値はチェック済みだと思いますがどうなってました?
95・98・ME系とNT・2000・XP系ってもの(この場合メッセージ)
によっては処理される内容違ったりしますよね(今回はあまり関係ないかも)
この辺いちいち指摘されんでも最初の投稿のとき示すべきじゃないですか
それにハンドルネームが「VC++6user」だからといって必ずしも想像させる
VC++ Ver6 を使っているとは限らないでしょう
お願いします、質問者側の自己責任果たしてください
かなり有効な回答得られると思いますよ
wood様、いつもレスありがとうございます。
情報が足りなくてすいません。^^;気を付けます。
使用しているものは、Visual C++ 6.0 Enterprise edition
で、Service Pack4を当てました。
なぜ、PreTranslateMessageかというと、コントロールがフォーカスを持つと
OnKeyDown,OnSysKeyDown,OnCharなどは効かないので
そのような時はPreTranslateMessage関数があります・・・とか本に書いてましたので
そうするしか、他の良いやり方があっても今の自分には思いつきませんでした。
言い訳がましいですが、知識、経験、実力不足しており、レベルの違いもありまして
逆に聞かれると、お答えできないことも多くて、すいません。^^;
それでも、ヒントやいろいろ教えて頂けていることに感謝しております。
今後もよろしくお願い致します。
Win98/Me を使っていた頃、VC++6.0 でのデバッグ実行時にプログラムの
ツールバーにマウスカーソルをあてるだけでプログラムが異常終了して
しまうな、環境上の問題が起きることが多々ありました。
そういうときは、確か一部のキー入力も効かなくなくなっていたような
記憶があります。
今では Win2K/XP でしか使ってないので確認できませんが。
プログラムには問題が無くても、時にはそういうこともあるってことで、
関係ないと思っても、環境も書いておいたほうがいいと思います。
すいません。環境も書き忘れていました。^^;今だに、Windows98 SEです。
頑張ってWin32アプリを書けるようになって、近いうちに、Windows2000に
移行するつもりではあります。OSのCDは入手済みなんですが・・・
>OnKeyDown,OnSysKeyDown,OnChar
のうちOnKeyDown,OnChar で「'r'や'y'キー」に対する処理してませんか
ちなみに
VC++6user 2004/08/07(土) 18:49:36の
pMsg->message と pMsg->wParam って同じく無い?
UpdateData(TRUE); は機能してないと思うよ
SP6出てるよ、まず当ててみたらどうでしょうか?
意味もわからず、カプセル化されている内容もわからず
MFCとWin32APIを使おうとするのはあまり関心しませんよ
俺なんか「メッセージBOX」で堂々巡りになったことあるよ
>Visual C++ 6.0 Enterprise edition
なら SP5 が MSから無償提供されてくるはずですが?
> if (pMsg->wParam == VK_F3 || pMsg->wParam == VK_F10) {
> UpdateData(TRUE);
> return TRUE;
> }
関数をよく見て、この部分がおかしいとは気付きませんか?
このままだど、
wParamがたまたまVK_F3orVK_F10に一致する全てのメッセージが
捨てられてしまいます。
#例えば、WM_CHARでwParamがVK_F3(=0x72='r')の場合とかね。
dairygoods様
なるほど。
wParamに別物(WM_CHAR?)のVK_F3とVK_F10に一致する値が入ってくることなど
無いと勝手に思い込んでいました。マヌケでした。^^;
ご指摘ありがとうございました。
ちなみに、VK_F10の場合は、システム的に?制御(フォーカス?)がタイトルバーの
メニュー(ダイアログでは見えませんけど・・・)の方へ移されてしまいますので
returnさせています。
VK_F3の場合は特にその必要も無かったのですが、同じファンクションキー押下ですし
どっちでも問題無いだろうと、これまた安易に入れてしまっていました。
また一つ、愚かなミスをやり^^;勉強させて頂きました。