別の非アクティブなフォームからショーダイアログフォームにキーを送信したい.画像を参照してください
フォーム a はダイアログを表示しています。その後ろには、カスタマイズされたキーボードとテンキーを備えた別のフォームがあります。これらのボタンのクリックに対してキーを送信するだけです。キーボードからキーを送信してダイアログフォームを表示できるのはどうしてですか。
別の非アクティブなフォームからショーダイアログフォームにキーを送信したい.画像を参照してください
フォーム a はダイアログを表示しています。その後ろには、カスタマイズされたキーボードとテンキーを備えた別のフォームがあります。これらのボタンのクリックに対してキーを送信するだけです。キーボードからキーを送信してダイアログフォームを表示できるのはどうしてですか。
あなたが求めていることは本質的に不可能です。モーダル ダイアログがどのように機能するか (ShowDialog
メソッドを使用して表示されるフォームはモーダルです) を理解すると、その理由が理解できます。モーダル ダイアログは、ユーザーがそのダイアログのみを操作するように強制する場合に使用されます。それらのウィンドウを無効にすることで、アプリケーション内の他のウィンドウと対話することを防ぎます。それらはマウス クリックの影響を受けなくなり、キーボード入力を受け取らず、フォーカスを受け取れなくなります。Windows はビープ音を鳴らし、モーダル ダイアログのタイトル バーをフラッシュします。
ここで何が起こっているかというと、メソッドを使用して "Deposits" フォームをモーダル ダイアログShowDialog
として表示すると、アプリケーション内の他のすべてのウィンドウが無効になります。特定のケースでは、スクリーン キーボードを含むウィンドウも無効になっており、マウス クリック イベントを受信できないことを意味します。そのため、「キー」(ボタン) をクリックしようとしても何も起こりません。
(コメントで提案したように)最も簡単な回避策は、代わりにメソッドを使用して、「預金」フォームを非モーダルダイアログとして表示することです。Show
モーダル ダイアログとは異なり、これはアプリケーション内の他のウィンドウを無効にしないため、ユーザーはそれらすべてを一度に操作できます。別のウィンドウをクリックすると、そのウィンドウにフォーカスが設定され、入力イベントを処理できるようになります。しかし、「預金」フォームでメインウィンドウのすべてのコントロールを無効にしたいが、スクリーンキーボードは無効にしたくないので、これはうまくいかないとあなたは言います。
もちろん、最初は「ありえない」と嘘をつきました。私が言いたかったのは、これは非常にトリッキーであり、標準の Windows 対話モデルを回避する必要があるということです。
それをどのように行うかについてのいくつかのアイデアが頭に浮かびます。
最近のすべてのバージョンの Windows に含まれているスクリーン キーボード ユーティリティを使用できます。Microsoft は、この目的のためのプログラムを既に提供しています。独自のものを構築して維持する必要はありません。ユーザーが「キー」の 1 つをクリックしたときにフォーカスが奪われるのを防ぐために必要なすべてのロジックが既に含まれています。また、それはプログラムの一部ではないため、メソッドを使用してフォームをモーダルとして表示すると、無効になりませんShowDialog
。確認するには、[スタート] -> [ファイル名を指定して実行] に移動し、 と入力しosk
ます。
たとえば、Windows 7 では次のようになります。
どうしても独自のカスタム デザインのオンスクリーン キーボードを使用する場合は、モーダル ダイアログの子ウィンドウとして表示する必要があります。つまり、通常どおり、アプリケーションはメイン フォームから開始します。次に、メソッドを使用して「預金」フォームをモーダル ダイアログとして表示するShowDialog
と、メイン フォームが無効になります。「預金」フォームから、非モーダルな方法を使用してオンスクリーン キーボード フォームを表示できますShow
。メイン フォームは、モーダル ダイアログ ("Deposits" フォーム) を表示しているため、まだ無効になっています。ただし、非モーダル ダイアログ (スクリーン キーボード) が表示されているため、"Deposits" フォームは無効になりません。