質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Q&A

解決済

3回答

2416閲覧

モーダルダイアログ表示・破棄時のメッセージ取得

s-aoyama

総合スコア13

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

0グッド

1クリップ

投稿2018/06/05 06:26

編集2018/06/05 06:28

スキャナーを利用・管理する、ベースフォームを作りたいと思っています。
ベースフォームを継承したフォームを作成して、
継承フォームからモーダルダイアログを呼び出している間、
スキャナーを停止させたいと思っております。

モーダルダイアログ表示時→スキャナークローズ
モーダルダイアログ破棄時→スキャナーオープン

といった感じで、ベースフォーム側にスキャナのオープン処理・クローズ処理を記述したいのですが、
モーダルダイアログの表示・破棄をベースフォーム側で受け取ることができるイベント、もしくはウィンドウズメッセージはありませんでしょうか。

OSはWindows7, Windows10, WindowsCEを想定しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

色々と検討した結果、モーダルダイアログ表示時・破棄時ではなく、
フォームのEnableが変更されたときに、スキャナをオープン・クローズすることにしました。

実装は以下の形でやっていこうと思います。

C#

1 2 /// <summary> 3 /// ウィンドウの有効無効の変更を通知するウィンドウズメッセージ 4 /// </summary> 5 private const int WM_ENABLE = 10; 6 /// <summary> 7 /// 有効状態のWPARAM 8 /// </summary> 9 private const int WPARAM_ENABLE_WINDOW = 0x0001; 10 /// <summary> 11 /// 無効状態のWPARAM 12 /// </summary> 13 private const int WPARAM_DISENABLE_WINDOW = 0x0000; 14 15 /// <summary> 16 /// ウィンドウズメッセージを処理します 17 /// </summary> 18 /// <param name="m"></param> 19 protected override void WndProc(ref Message m) 20 { 21 //現ウィンドウの有効無効の変更通知であった場合 22 if (m.Msg == WM_ENABLE && m.HWnd == this.Handle) 23 { 24 if (m.WParam.ToInt32() == WPARAM_ENABLE_WINDOW) 25 { 26 //有効化されたとき 27 scanner.Open(); 28 } 29 else if (m.WParam.ToInt32() == WPARAM_DISENABLE_WINDOW) 30 { 31 //無効化されたとき 32 scanner.Close(); 33 } 34 } 35 base.WndProc(ref m); 36 }

ほか、ウィンドウズメッセージを使わずとも、フォームのEnableChangedイベントでも同様のことができそうです。

ありがとうございました。

投稿2018/06/06 05:37

編集2018/06/06 05:39
s-aoyama

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

モーダルダイアログの表示・破棄をベースフォーム側で受け取ることができるイベント、もしくはウィンドウズメッセージはありませんでしょうか。

ないです。

代替案としては、ベースフォーム側でダイアログ表示を制御する方法が考えられます。スキャナー制御しつつダイアログ表示を行う専用のメソッドを用意し、モーダルダイアログを表示する際はそれを使うようにすれば良さそうな気がします。

例えばこんな感じのメソッドです。

C#

1public partial class MyBaseForm : Form 2{ 3 : 4 : 5 public DialogResult SpecialShowDialog(Form dialog) 6 { 7 CloseScanner(); // スキャナークローズ 8 DialogResult result = dialog.ShowDialog(); 9 OpenScanner(); // スキャナーオープン 10 return result; 11 } 12}

投稿2018/06/05 12:36

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s-aoyama

2018/06/06 00:12

ありがとうございます。 そちらの方向で検討してみます。 ところで、私の方でもウィンドウズメッセージを探してみましたが、 例えばWM_CANCELMODEメッセージでは、 モーダルフォームの表示をとれないものでしょうか。
catsforepaw

2018/06/06 00:48

確かにモーダルダイアログを開くとWM_CANCELMODEが送られてきますが、WM_CANCELMODEメッセージはそれ以外の要因でも送られてきますから、WM_CANCELMODEが送られてきたからモーダルダイアログが開いた、と判定することはできません。
guest

0

そのモーダルフォーム側で、生成/破棄時にイベント出させるようにした方がいいんじゃないでしょうか

投稿2018/06/05 06:58

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s-aoyama

2018/06/05 07:44

そちらもできなくはないですが、できれば今後のために、 スキャナ関連の処理は1つのベースフォームに纏めたいなと思っています。 無理であるならあきらめますが、できればベースフォームだけの改造で、 モーダルフォームの生成・破棄を受け取れないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問