トップ回答者
ボタンにフォーカスがあたるとショートカットキーが効かない

質問
-
ボタンのTextに(&A)のように入力してショートカットキーを設定しています。
このボタンにフォーカスがあたっているとき、割り当てたショートカットキーを入力してもボタンをクリックしたことになりません。
また、複数のボタンがありそれぞれにショートカットキーを設定していますが、一度フォーカスがあたり、その後にフォーカスを別のボタンに移してもショートカットキーが無効のままになります。
フォーカスが移る前まではどのボタンもショートカットキーは有効です。
フォーカスが移動した後も無効のままになるというのが特に不可解な点です。
動作環境はWindowsXP Pro SP3、.NET Frameworks1.1です。
作成したのはVB.NET2003です。
以下、思いつく情報を。(足りてない情報がありましたらご指摘ください)
・アプリは他のランチャーより起動(子プロセスという形で生成)。
・同一環境で、ランチャーのみ別のものを使用している環境ではショートカットキーの不具合は発生しない。
・Windows2000に持っていって動かしてもショートカットキーの不具合は無し。
・VB6をVB.NET2003でアップグレードしたあとに修正して動かせるようにしたため、あちこちのコントロールにVB6Compatibleが存在している。
・問題のボタンもVB6のBottonArrayに登録している。
・無効になっているとき、BottonArrayのクリックイベントハンドラーを通過していないのは確認済み。
・ファイルより情報を読み込んで動的にボタンを生成しているため、ボタンの数が1ページ分に収まらない場合、ページ切り替えのボタンを押すごとに表示するボタンの中身を入れ替えている。
(ページ切り替えのための処理で何かルールから外れたコードを記述している可能性はあります)
・フォームのKeyDownイベントハンドラーではショートカットキーの認識はできている。(Alt+Aなどが識別できるのを確認)
特定の環境でのみ発生するというのも理解の及ばない部分です。
なにか心当たりがありましたらご教授ください。
よろしくお願いします。
回答
-
こんにちは。
sentinel_msdn さんからの引用 以下、思いつく情報を。(足りてない情報がありましたらご指摘ください)
・アプリは他のランチャーより起動(子プロセスという形で生成)。
・同一環境で、ランチャーのみ別のものを使用している環境ではショートカットキーの不具合は発生しない。
・Windows2000に持っていって動かしてもショートカットキーの不具合は無し。
・VB6をVB.NET2003でアップグレードしたあとに修正して動かせるようにしたため、あちこちのコントロールにVB6Compatibleが存在している。
・問題のボタンもVB6のBottonArrayに登録している。
・無効になっているとき、BottonArrayのクリックイベントハンドラーを通過していないのは確認済み。
・ファイルより情報を読み込んで動的にボタンを生成しているため、ボタンの数が1ページ分に収まらない場合、ページ切り替えのボタンを押すごとに表示するボタンの中身を入れ替えている。
怪しきものには目をつけているのであれば、まずはどれが原因か切り分ける作業が先ではないでしょうか?
すべての返信
-
こんにちは。
sentinel_msdn さんからの引用 以下、思いつく情報を。(足りてない情報がありましたらご指摘ください)
・アプリは他のランチャーより起動(子プロセスという形で生成)。
・同一環境で、ランチャーのみ別のものを使用している環境ではショートカットキーの不具合は発生しない。
・Windows2000に持っていって動かしてもショートカットキーの不具合は無し。
・VB6をVB.NET2003でアップグレードしたあとに修正して動かせるようにしたため、あちこちのコントロールにVB6Compatibleが存在している。
・問題のボタンもVB6のBottonArrayに登録している。
・無効になっているとき、BottonArrayのクリックイベントハンドラーを通過していないのは確認済み。
・ファイルより情報を読み込んで動的にボタンを生成しているため、ボタンの数が1ページ分に収まらない場合、ページ切り替えのボタンを押すごとに表示するボタンの中身を入れ替えている。
怪しきものには目をつけているのであれば、まずはどれが原因か切り分ける作業が先ではないでしょうか?
-
回答者の皆様、まずはアドバイスありがとうございます。
仕事でかかわっているという事柄上、実物から詳細なコードは出せませんので自分で検証用のコードを書いてみてそれをアップするという形になると思います。
業務としては、「フォーム側のイベントハンドラーでキャッチできており、コードの置き換えが出来る以上はそれでよい」という流れになっていますので、最終的に原因追求にまでたどり着けるかは分かりません。多分、来週を過ぎたら会社で検証することは無いと思われます。
なので、それ以降は個人で検証してみるという形になると思います。その場合は、時間がかかるかと思われますのでご了承ください。
まず、これ以降で検証してみる予定の内容は、
・ランチャーでCreateProcessしているとき、パラメータに設定している内容が何か。
・ページ切り替えのために行っている処理の内容の把握。
です。
発生する環境の差異として、起動に使用しているランチャーのみ違いがあるということがあるため、そのランチャー(テスト用の自作)のコードをチェックしてみるつもりです。
ただし、Win2000環境ではそのランチャーを使用しても問題は起きていないことを考えるとそれのみが原因とは思えません。
また、書き忘れたことに気づいたので書きますが、「無効にならないボタンもある」という点があります。
二つのButtonArrayがあるのですが、そのうちの一つのButtonArrayは表示されている後半半分のボタンはフォーカス遷移の有無にかかわらずショートカットキーが常に有効となっています。(前半分はフォーカス遷移により無効になる)
なので、実装したコードの中にも鍵がありそうです。
(自分が一通り見た限りでは、もう一つのButtonArrayと違うことをしているとは見えませんでしたが、動きに違いがあるので何かあるのだと思います)
また進展がありましたら書き込みます。
よろしくお願いします。 -
進展がありましたのでお知らせします。
結論として、.NET Framework1.1に問題があったということになりました。
これは、.NET Framework1.1 SP1を適用すると正常にショートカットキーが使えるようになるということが分かったためです。同一環境だったはずなのですが、.NET Framework1.1の場合「プログラムの追加と削除」画面にてSP1適用後もSP1の項目が現れないため気づかなかったようです。
作成したアプリケーションはそのままの状態で、.NET Framework1.1 SP1を適用後は正常にショートカットキーが動作し、一度.NET Framework1.1を削除した後再インストール(SP1適用無しの状態)すると現象が再現するのを確認しました。
なお、前回の返信で書きました、「ボタンの操作内容」「CreatePrcessのパラメータ」ですが、一応調査しました。「ボタンの操作内容」で特に変わったことをしている部分は無いように見えました。
これは、同一のアプリがWin2000環境では正常に動作していることからもバグなどの要因が含まれている可能性は少ないと判断してよいと思います。「CreatePrcessのパラメータ」ですが、これも変わったことは何もしていません。
パラメータの内容はすべてデフォルトを指定しており、親プロセス(ランチャー)のプロセス属性をそのまま引き継いでいる状態です。
ランチャー自身は、実行ファイルをダブルクリックなどで起動しており、きわめてノーマルな状態だと言えます。ご参考までに。
以上を持ちまして、この問題については.NET Framework1.1のSP1を適用させることで解決できるという結論にしたいと思います。アドバイスしていただいた方々に感謝します。
ありがとうございました。なお、誤記で投稿してしまったタイトルがどうしても気になったので修正しました。
(「ショートカットキー効かない」→「「ショートカットキーが効かない」」)
お気になりましたら申し訳ありません。 -
こんにちは、フォーラムオペレータ大久保です。
sentinel_msdn さん、問題解決のご報告ありがとうございます!
大変勝手ながら、この情報を多くの方にご利用いただきたく、また多くのアドバイスをいただいたという意味でも、アドバイスをくださった皆様の投稿に「回答済み」チェックをつけさせていただきました。
まだまだ .Net Framework 1.1 の環境も多くあることと思いますし、sentinel_msdn さんの情報は大変貴重と思います。
アドバイスをくださった皆さま、ありがとうございました!
それでは、今後ともMSDNフォーラムをよろしくお願いします