ダイアログのエディットボックスで入らない文字キーがありますが・・・ – プログラミング – Home

ダイアログのエディットボックスで入らな...
 
通知
すべてクリア

[解決済] ダイアログのエディットボックスで入らない文字キーがありますが・・・

固定ページ 1 / 2

VC++6user
 VC++6user
(@VC 6user)
ゲスト
結合: 20年前
投稿: 23
Topic starter  

お世話になります。
SDIアプリ作成過程で、リソースに新規挿入したダイアログに貼り付けた
エディットボックスでの入力を試すと、気付いている範囲では
'r'や'y'キーなどを押しても反応が無く、エディットボックスに文字が入りません。
それらのキーは何かシステム用に割り当てられていて?デフォルトでは
効かなくなっていたりするのでしょうか?的外れかもしれませんが・・・^^;
どうすれば普通に全てのキーが入力できますでしょうか?
どうか、ご教授下さい。よろしくお願い致します。


引用未解決
トピックタグ
VC++6user
 VC++6user
(@VC 6user)
ゲスト
結合: 20年前
投稿: 23
Topic starter  

↑半角小文字の'r'と'y'などが反応無く、入りません。
半角の大文字や、全角日本語入力モードでは入りますが・・・
なぜなのでしょうか?ご助言下さい。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

いつになったら、ここの最低マナー守ってくれるのかな

「発言される前に「使用上の注意」を必ずお読み下さい。」
これは「追加発言に限定」されるのではなく「新規質問」時も適用されます

質問内容の情報、少なすぎ!


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

多分、アクセラレータかフック系アプリに食われているのかも?


返信引用
VC++6user
 VC++6user
(@VC 6user)
ゲスト
結合: 20年前
投稿: 23
Topic starter  

レスありがとうございます。

SDI(FormView)プログラムで、オーバーライドしましたPreTranslateMessage()関数
から飛ばした先で、インスタンスを生成してDoModal()したダイアログに貼り付けてある
エディットボックス内でキー入力をした時、半角小文字の'r'と'y'のみ反応無く
文字が入りません。親のFormView上に貼り付けたエディットボックスでの入力では
大丈夫なのですが・・・。今の自分には原因がちょっと見当つきません。
情報が不十分かもしれませんが・・・^^;引き続き、ご推察よろしくお願い致します。


返信引用
ミチナギ
 ミチナギ
(@ミチナギ)
ゲスト
結合: 20年前
投稿: 1
 

はじめまして。

>'r'や'y'キーなどを押しても反応が無く、エディットボックスに文字が入りません。
他の文字が問題なく入力できるということなので、文字を入力したときに
発生するイベントを捕まえたりしていないのならばそのプログラム側には
問題ないと思います。おそらく他に原因があると思います。


返信引用
VC++6user
 VC++6user
(@VC 6user)
ゲスト
結合: 20年前
投稿: 23
Topic starter  

レスありがとうございます。

そのエディットボックスを貼りつけてありますダイアログのクラスでも、いちお
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);
}


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

なぜ「PreTranslateMessage」なの?
どこまでWM_KEYDOWN届いているかデバックできないの
デバッガの使い方知らないのなら、SPY++を使うことをお勧めします

RAPT さんの「アクセラレータ」は「オーバーライド」したことにより
自分でフィルタ処理してませんかということだと思います

MSDN一部引用
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Windows 関数 TranslateMessage や DispatchMessage にディスパッチされる前に、ウィ
ンドウ メッセージをフィルタ処理するには、この関数をオーバーライドします。既定の
実装では、アクセラレータ キーの変換を行います。そのため、オーバーライドした
CWinApp::PreTranslateMessage メンバ関数を呼び出す必要があります。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「アクセラレータ キーの変換を行います」ってどんなことしてるんでしょうな?
ちゃんとわかって使ってますよね

PreTranslateMessageの戻り値はチェック済みだと思いますがどうなってました?

95・98・ME系とNT・2000・XP系ってもの(この場合メッセージ)
によっては処理される内容違ったりしますよね(今回はあまり関係ないかも)

この辺いちいち指摘されんでも最初の投稿のとき示すべきじゃないですか

それにハンドルネームが「VC++6user」だからといって必ずしも想像させる
VC++ Ver6 を使っているとは限らないでしょう

お願いします、質問者側の自己責任果たしてください
かなり有効な回答得られると思いますよ


返信引用
VC++6user
 VC++6user
(@VC 6user)
ゲスト
結合: 20年前
投稿: 23
Topic starter  

wood様、いつもレスありがとうございます。

情報が足りなくてすいません。^^;気を付けます。
使用しているものは、Visual C++ 6.0 Enterprise edition
で、Service Pack4を当てました。

なぜ、PreTranslateMessageかというと、コントロールがフォーカスを持つと
OnKeyDown,OnSysKeyDown,OnCharなどは効かないので
そのような時はPreTranslateMessage関数があります・・・とか本に書いてましたので
そうするしか、他の良いやり方があっても今の自分には思いつきませんでした。

言い訳がましいですが、知識、経験、実力不足しており、レベルの違いもありまして
逆に聞かれると、お答えできないことも多くて、すいません。^^;
それでも、ヒントやいろいろ教えて頂けていることに感謝しております。
今後もよろしくお願い致します。


返信引用
zxcv
 zxcv
(@zxcv)
ゲスト
結合: 20年前
投稿: 6
 

Win98/Me を使っていた頃、VC++6.0 でのデバッグ実行時にプログラムの
ツールバーにマウスカーソルをあてるだけでプログラムが異常終了して
しまうな、環境上の問題が起きることが多々ありました。
そういうときは、確か一部のキー入力も効かなくなくなっていたような
記憶があります。
今では Win2K/XP でしか使ってないので確認できませんが。

プログラムには問題が無くても、時にはそういうこともあるってことで、
関係ないと思っても、環境も書いておいたほうがいいと思います。


返信引用
VC++6user
 VC++6user
(@VC 6user)
ゲスト
結合: 20年前
投稿: 23
Topic starter  

すいません。環境も書き忘れていました。^^;今だに、Windows98 SEです。
頑張ってWin32アプリを書けるようになって、近いうちに、Windows2000に
移行するつもりではあります。OSのCDは入手済みなんですが・・・


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>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」で堂々巡りになったことあるよ


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>Visual C++ 6.0 Enterprise edition
なら SP5 が MSから無償提供されてくるはずですが?


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> if (pMsg->wParam == VK_F3 || pMsg->wParam == VK_F10) {
> UpdateData(TRUE);
> return TRUE;
> }

関数をよく見て、この部分がおかしいとは気付きませんか?

このままだど、
wParamがたまたまVK_F3orVK_F10に一致する全てのメッセージが
捨てられてしまいます。
#例えば、WM_CHARでwParamがVK_F3(=0x72='r')の場合とかね。


返信引用
VC++6user
 VC++6user
(@VC 6user)
ゲスト
結合: 20年前
投稿: 23
Topic starter  

dairygoods様

なるほど。
wParamに別物(WM_CHAR?)のVK_F3とVK_F10に一致する値が入ってくることなど
無いと勝手に思い込んでいました。マヌケでした。^^;
ご指摘ありがとうございました。

ちなみに、VK_F10の場合は、システム的に?制御(フォーカス?)がタイトルバーの
メニュー(ダイアログでは見えませんけど・・・)の方へ移されてしまいますので
returnさせています。
VK_F3の場合は特にその必要も無かったのですが、同じファンクションキー押下ですし
どっちでも問題無いだろうと、これまた安易に入れてしまっていました。
また一つ、愚かなミスをやり^^;勉強させて頂きました。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました