C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[18]: 起動中のメッセージボックスを無効化したい


(過去ログ 22 を表示中)

[トピック内 20 記事 (1 - 20 表示)]  << 0 >>

■9700 / inTopicNo.1)  起動中のメッセージボックスを無効化したい
  
□投稿者/ しの (3回)-(2007/11/02(Fri) 15:31:26)

分類:[.NET 全般] 

.NETで起動中のメッセージボックスを無効化したいのですが、
↓下記コードでは、Windowしか無効化できないです。
どう書いたらいいでしょうか?ハンドルを取るんでしょうか?

For Each p As System.Diagnostics.Process In Process.GetProcesses()
If Not p.MainWindowHandle.Equals(System.IntPtr.Zero) Then
EnableWindow(p.MainWindowHandle, False)
End If
Next p

プログラミングWindows(上下)を読み始めなので、
調べることもできません。

よろしくお願いします。
引用返信 編集キー/
■9702 / inTopicNo.2)  Re[1]: 起動中のメッセージボックスを無効化したい
□投稿者/ 囚人 (214回)-(2007/11/02(Fri) 15:44:50)
.NET「で作った」起動中のメッセージボックス
なのか
.NET「を使って」、起動中のメッセージボックス
なのか。


>ハンドルを取るんでしょうか?

その通りです。どうにかして対象のハンドルを入手しないといけません。入手方法は用件次第。さて「何の」メッセージボックスを対象としたいのでしょうか?


>.NETで起動中のメッセージボックスを無効化したいのですが、
>↓下記コードでは、Windowしか無効化できないです。

細かいことを言うと、メッセージボックスもトップレベルウィンドウもボタンもテキストボックスも全部 Window です。

引用返信 編集キー/
■9709 / inTopicNo.3)  Re[2]: 起動中のメッセージボックスを無効化したい
□投稿者/ しの (4回)-(2007/11/02(Fri) 16:36:22)
え〜とですね。。。
.NET「で作った」アセンブリから起動中のメッセージボックスですね。

タイマ起動がトリガーなんですけど、
自アセンブリで出したメッセージボックスを自アセンブリで無効化したいです。

> 細かいことを言うと、メッセージボックスもトップレベルウィンドウもボタンもテキストボックスも全部 Window です。
目から鱗が落ちました。 「ハンドルを取る」という言葉しか知らないので。。。
検索で調べ中です。。。


引用返信 編集キー/
■9710 / inTopicNo.4)  Re[3]: 起動中のメッセージボックスを無効化したい
□投稿者/ しの (5回)-(2007/11/02(Fri) 16:40:45)
修正します・・・

タイマ起動⇒.NET「で作った」全てのアセンブリのメッセージボックスを
全て無効化したいです

引用返信 編集キー/
■9712 / inTopicNo.5)  Re[4]: 起動中のメッセージボックスを無効化したい
□投稿者/ しの (6回)-(2007/11/02(Fri) 16:49:34)
FindWindowで取るときのクラス名は、.NETで定義できるんですかね?

hwindow = FindWindow(クラス名, vbNullString)
msgbox hwindow

(クラス名には、RegisterClass 関数または RegisterClassEx 関数で登録した名前か、定義済みのコントロールクラス名を指定できます)


引用返信 編集キー/
■9715 / inTopicNo.6)  Re[5]: 起動中のメッセージボックスを無効化したい
□投稿者/ 囚人 (215回)-(2007/11/02(Fri) 17:01:56)
ちょっとまだ何がしたいのかわからないのですが、アプリケーションのウィンドウを全て閉じたいって事ですか?

メインウィンドウ以外のダイアログ?だったら、ダイアログを開くたびに参照を保存しておいたらよくないですか?

.NET WindowsForms でハンドルを直接触るのは良い作法とは言えないと思いますが、とりあえず
EnumChildWindows API
はどうでしょうか。


>FindWindowで取るときのクラス名は、.NETで定義できるんですかね?

プログラミング Windows をもっと読めば分かりますが(というか序盤中の序盤にあります)、それは「ウィンドウクラス」というもので、オブジェクト指向言語で言うクラスとは別物です。
引用返信 編集キー/
■9716 / inTopicNo.7)  Re[6]: 起動中のメッセージボックスを無効化したい
□投稿者/ 囚人 (216回)-(2007/11/02(Fri) 17:05:09)
>> FindWindowで取るときのクラス名は、.NETで定義できるんですかね?
>
>プログラミング Windows をもっと読めば分かりますが(というか序盤中の序盤にあります)、それは「ウィンドウクラス」というもので、オブジェクト指向言語で言うクラスとは別物です。

もしかしたら、それは分かった上での質問でしたか?
RegisterClass で新しいウィンドウクラスを登録することはできるでしょうけど、WindowsForms が使っているウィンドウクラスは別なので意味ないですよ。
引用返信 編集キー/
■9718 / inTopicNo.8)  Re[7]: 起動中のメッセージボックスを無効化したい
□投稿者/ しの (7回)-(2007/11/02(Fri) 17:41:52)
>ちょっとまだ何がしたいのかわからないのですが
ごめんなさい、ごめんなさい。。。

アプリケーションのウィンドウを全て「クリックすることができない」ようにしたい。

ですので、EnableWindowで画面フォームだけは無効化できますよね?

さらに、画面フォームから表示している、メッセージボックスまで、
「クリックすることができない」ようにしたいです。
引用返信 編集キー/
■9722 / inTopicNo.9)  Re[8]: 起動中のメッセージボックスを無効化したい
□投稿者/ しの (8回)-(2007/11/02(Fri) 18:20:52)
FindWindowをキャプションで取るような、やり方がありますけど、

これって、Windowsプログラミングの世界では、正攻法なんでしょうか?


「キャプションかよ」と思ってしまいます。

引用返信 編集キー/
■9744 / inTopicNo.10)  Re[9]: 起動中のメッセージボックスを無効化したい
□投稿者/ 囚人 (217回)-(2007/11/03(Sat) 16:30:14)
自分のアプリケーションのフォームだけに何かをしたいときに FindWindow だとかは普通は使わなくないですか?自分が管理できない他のプロセスのウィンドウに何かしたい時に有用だと思いますけど。言い方を変えると、そんなことしなくても「自分の」Window は簡単に見つけられませんか?例えばウィンドウを開くたびに配列なりコレクションなりに保持しておくだけでも簡単です。

System.Windows.Forms.Application.OpenForms に開いたフォームのコレクションがとれるみたいですが、メッセージボックスまで取得できるかな?お試しを。

引用返信 編集キー/
■9746 / inTopicNo.11)  Re[10]: 起動中のメッセージボックスを無効化したい
□投稿者/ はつね (314回)-(2007/11/03(Sat) 18:34:03)
はつね さんの Web サイト
> 自分のアプリケーションのフォームだけに何かをしたいときに FindWindow だとかは普通は使わなくないですか?

自分のフォームだったらFindWindowsとかで対処するよりもメッセージボックスを出さなくするようなパラメタなりプロパティなりを追加する方が良いように思います。
プロパティやパラメタ(VB2005ならばOptionalパラメタがある)のデフォルト値は「表示する」にしておけば、既存部分へのインパクトも少ないでしょうし。


> 自分が管理できない他のプロセスのウィンドウに何かしたい時に有用だと思いますけど。

ですね。

引用返信 編集キー/
■9768 / inTopicNo.12)  Re[11]: 起動中のメッセージボックスを無効化したい
□投稿者/ しの (12回)-(2007/11/04(Sun) 14:47:37)
>そんなことしなくても「自分の」Window は簡単に見つけられませんか?
言われてみればそうですね・・・

1機能ごとに、1アセンブリのアプリなので、(ログイン、メニュー、○○○入力画面)
Aから出たメッセージボックスが、Bの画面の入力中で押せたらまずいなど、
いろいろ仕様があるんですね。

引用返信 編集キー/
■9770 / inTopicNo.13)  Re[12]: 起動中のメッセージボックスを無効化したい
□投稿者/ はつね (317回)-(2007/11/04(Sun) 15:07:07)
はつね さんの Web サイト
No9768 (しの さん) に返信
> 1機能ごとに、1アセンブリのアプリなので、(ログイン、メニュー、○○○入力画面)
> Aから出たメッセージボックスが、Bの画面の入力中で押せたらまずいなど、
> いろいろ仕様があるんですね。

それってアセンブリ間の連携が必要なのにその部分がごっそり設計から抜け落ちてるって事なのでは?
で、できあがってしまったアセンブリの状態で外側から無理やり連携しようとしているのでWin-API使わざるを得ないって状況なんですよね?

引用返信 編集キー/
■9771 / inTopicNo.14)  Re[13]: 起動中のメッセージボックスを無効化したい
□投稿者/ しの (13回)-(2007/11/04(Sun) 15:46:41)
>それってアセンブリ間の連携が必要なのにその部分がごっそり設計から抜け落ちてるって事なのでは?
そのとおりだと思います。連携ができることを知っている人は、私の居るビルのフロアには居ません。

アセンブリ間の連携ってどうやってやるんですか?
まさか、引数で渡すとか(汗)
アセンブリ間はプロセス別だから、難しいと思う・・

技術がいるなら参考書籍を教えてください。

引用返信 編集キー/
■9773 / inTopicNo.15)  Re[14]: 起動中のメッセージボックスを無効化したい
□投稿者/ はつね (318回)-(2007/11/04(Sun) 16:18:18)
はつね さんの Web サイト
No9771 (しの さん) に返信
> >それってアセンブリ間の連携が必要なのにその部分がごっそり設計から抜け落ちてるって事なのでは?
> そのとおりだと思います。連携ができることを知っている人は、私の居るビルのフロアには居ません。
>
> アセンブリ間の連携ってどうやってやるんですか?
> まさか、引数で渡すとか(汗)
> アセンブリ間はプロセス別だから、難しいと思う・・

クラスライブラリも「アセンブリ」です。
例えば、メインメニューだけEXEなアセンブリにして他は全部DLL(クラスライブラリ)なアセンブリという構成も考えられます。
この場合は、まさにメソッドやプロパティとして連携する事になります。

もし、EXEなアセンブリ同士を連携するのであれば、ファイル連携、DB連携、プログラム間通信連携などが.NETの世界の中だけでも実現できる手法です。
でも、ちゃんとコードとしてその連携方式が双方に実装されていないと意味がありません。

で、現状はそういったソースコードレベルで双方に連携用のロジックをいれる方針がとれず(とらず?)という状況なのだと思います。
そうなってくると、.NETの世界から離れてOSレベルで外側から無理やり操作してあげる事になりますが、これってできましたっけ? >有識者の方

私はそういった力技をするくらいならば.NETじゃなくてネイティブCとかで組むでしょうし、今回のケースであればソースコードレベルで双方に機能実装すると思うので、手持ちの実績の中に実現するようなものがないです。

引用返信 編集キー/
■9774 / inTopicNo.16)  Re[15]: 起動中のメッセージボックスを無効化したい
□投稿者/ しの (14回)-(2007/11/04(Sun) 16:32:18)
>今回のケースであればソースコードレベルで双方に機能実装すると思うので、手持ちの実績の中に実現するようなものがないです。

今回は一部システム稼動しているので、大幅な方式の変更は無理です。
偉い人がそれを許してくれないでしょう。大人の事情です。

ただ、今後、プロジェクトはたくさんあるので、事前準備しておきたいです。
自分のWebサイトなら途中変更可能なのですが、

SIのシステムだと最初に組み込まないと無理ですね。
全体で数千万とか数億とかのプロジェクトの一部だとホント岩盤のようで
自由がきかないですよ。
引用返信 編集キー/
■9775 / inTopicNo.17)  Re[15]: 起動中のメッセージボックスを無効化したい
□投稿者/ れい (166回)-(2007/11/04(Sun) 16:39:44)
アセンブリというのが何かよく理解できてないのか、
勘違いで変なことをやろうとしてるのか、
プロジェクトの設計がダメなのか…

No9773 (はつね さん) に返信
> で、現状はそういったソースコードレベルで双方に連携用のロジックをいれる方針がとれず(とらず?)という状況なのだと思います。
> そうなってくると、.NETの世界から離れてOSレベルで外側から無理やり操作してあげる事になりますが、これってできましたっけ? >有識者の方

メッセージボックスって「OK」とか「Yes/No」とか選ぶあれですよね?
それに限らず、どの窓も外部から無理やり無効化することはできます。
自プロセス内なので少しましですが、かなり大変です。

って

>自分のWebサイトなら途中変更可能なのですが、

え?
ASP.Netなの?


引用返信 編集キー/
■9776 / inTopicNo.18)  Re[16]: 起動中のメッセージボックスを無効化したい
□投稿者/ 囚人 (220回)-(2007/11/04(Sun) 17:02:39)
>今回は一部システム稼動しているので、大幅な方式の変更は無理です。
>偉い人がそれを許してくれないでしょう。大人の事情です。

なるほど。


>1機能ごとに、1アセンブリのアプリなので、(ログイン、メニュー、○○○入力画面)
>Aから出たメッセージボックスが、Bの画面の入力中で押せたらまずいなど、
>いろいろ仕様があるんですね。

「一画面ごとに1アセンブリだけど全体で1プロセス」なのか「一画面ごとに1アセンブリ1プロセス」で話が違ってきますけど、どっちでしょう。

連携に困ってるから後者かな?

後者ならMutex なりのプロセス間通信を使って制御するとか、既にに出ている FindWindow などを使うかでしょうか。

おすすめできないですけど、簡単な手段として、画面全体に透明なウィンドウをモーダル(あるいはシステムモーダル)で出しちゃうとか。うまく設計しないと何も押せない状態になりそうですけどね。

話が拡散して具体的に何に困っているのかわからなくなりました。


>え?
>ASP.Netなの?

さすがにそれはないと信じたい。
引用返信 編集キー/
■9778 / inTopicNo.19)  Re[17]: 起動中のメッセージボックスを無効化したい
□投稿者/ しの (16回)-(2007/11/04(Sun) 17:17:09)
>「一画面ごとに1アセンブリだけど全体で1プロセス」なのか「一画面ごとに1アセンブリ1プロセス」で話が違ってきますけど、どっちでしょう。

1機能で1アセンブリ=1EXEです。
1機能なので、サブフォームが入ります。ログイン画面ならパスワード変更なんかは、別画面で入るわけですね。
業務よって、1機能の中に何画面が入っていて、VBの1アセンブリになっている。
全部EXEです。EXEがたくさんある状態で、プロセス起動している。


>話が拡散して具体的に何に困っているのかわからなくなりました。
すんませんです・・・
具体的には⇒『Aから出たメッセージボックスが、Bの画面の入力中で押せたらまずい』

>System.Windows.Forms.Application.OpenForms に開いたフォームのコレクションがとれるみたいですが
↑これやってみます月曜に


>ASP.Netなの?
違います。Client-Serverです。すんませんまぎらわしいこと言って・・・
引用返信 編集キー/
■9779 / inTopicNo.20)  Re[18]: 起動中のメッセージボックスを無効化したい
 
□投稿者/ れい (167回)-(2007/11/04(Sun) 17:29:17)
No9778 (しの さん) に返信
> 1機能で1アセンブリ=1EXEです。
> 1機能なので、サブフォームが入ります。ログイン画面ならパスワード変更なんかは、別画面で入るわけですね。
> 業務よって、1機能の中に何画面が入っていて、VBの1アセンブリになっている。
> 全部EXEです。EXEがたくさんある状態で、プロセス起動している。

えーと、それを言うなら、1機能1アセンブリ1プロセスと言うべきです。
exeはファイルであって、プロセスとは対応していません。

> 具体的には⇒『Aから出たメッセージボックスが、Bの画面の入力中で押せたらまずい』

GUIのデザイン上まずいのであれば、
BをTopMostにするなりして解決します。
ユーザーがAlt+Tabした時などはあきらめるべきです。

システム上まずいのであれば、
A、Bが排他的に動くようにコーディングしなければダメです。
そのためにOSには同期機構があります。
OSの同期機構でも、DBのロック機構でも、ファイルのロック機構でもなんでもいいですが、
これはA、Bをつくるプログラマそれぞれが気にしなければいけないことです。

もう動いている、というなら、
いまさら、どうにもなりません。

しのさんがBのプログラマなら、
「他のウィンドウのメッセージボックスを無効化する」などを考えずに、
「他のウィンドウを操作するな」と警告を表示するようにしたり、
他のウィンドウを操作しても大丈夫なプログラムにするよう、
考えるしかないですね。

> 違います。Client-Serverです。すんませんまぎらわしいこと言って・・・

Client-Serverシステムなら、
「Aから出たメッセージボックスが、Bの画面の入力中で押せたらまずい」
という時点で設計が間違っています。
Client-Serverの利点がかなり失われています。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -