2011-05-22 14 views
2

C#.NETで何らかの理由で最初に起動されたときにメッセージボックスを開くプロセスを起動しています。私のアプリケーションから行う必要があるのは、このメッセージボックスが開かれないようにするか、基本的にメッセージボックスの[OK]ボタンを自分のコードから "クリック"する方法を見つけることです。プロセスの子ウィンドウをブロックしますか?

サービスとして実行するときにメッセージボックスがプロセスをハングアップさせているので、私のコードからそのボックスを開いたり閉じたりする(OKを選択する)のを防ぐ方法を見つける必要があります。

私はいくつかのWin32 APIサンプルを見てきましたが、以前はそれを使用していなかったので少し奇妙に見えます。どんな提案も素晴らしいだろう!ここで

編集

は、問題に対する回避策として供給されたバッチファイルです。しかし、私はそれが実行可能ファイルを実行することを可能にすることを好むでしょう。説明は、-supwパラメーター(サーバー上でパスワードを設定するために)を使用すると、このメッセージ・ボックスがポップアップするというものでした。このバッチファイルはテストされ、動作しますが、ghettoという2つの実行可能ファイル(murmur2.exe)が必要です。

set /p VAR= < superadmin.txt 
start murmur2.exe -supw %var% 
ping 0.0.0.0 -n 3 > NUL 
tskill murmur2 
murmur.exe 
+0

あなたが産んでいるアプリは変更できないと思いますか? –

+0

本当に。それはオープンソースですが、依存関係のリストには聖書の長さがあります。 –

+0

これは明らかにサービスから実行するようには設計されていません。あなたは、サービスからユーザーモードのアプリケーションにあなたのアプリを変更する必要があります。サービスはUIを表示できません。サービスがメッセージボックスを表示しようとすると、サービスがクラッシュします。 –

答えて

2

PostMessage(FindWindow("#32770",*Title of the message box*),WM_CLOSE,NULL,NULL);

(非常にスリムなチャンスを持つ)かもしれないは、同じウィンドウが同時に同じタイトルと同じクラス名とそこに開かれるので、これは失敗証拠の方法ではありません。しかし、代替案は単に過度のものです。本当に失敗した場合は、EnumWindowsに電話してすべてのトップレベルのウィンドウを列挙し、各ウィンドウに対してGetWindowThreadProcessIdと呼び出して、起動したプロセスのIDとウィンドウのプロセスIDを比較する必要があります。両者が等しい場合は、GetClassNameGetWindowTextを呼び出して、クラス名(一般的なダイアログでは常に「#32770」)とメッセージボックスのタイトルを比較して、正しいウィンドウを閉じようとしていることを確認できます。完了したら、見つけたhWndを使ってWM_CLOSEでPostMessageを呼び出すことができます。

+0

メッセージを投稿する前にウィンドウが作成されるまで待つ必要があります –

+1

一般に、これは機能します。しかし、メッセージボックスを生成しようとしているプロセスがサービスとして実行されているときは機能しません。サービスはUIを表示できないため、ウィンドウは開かれません。それは決して開かれていないので、ウィンドウハンドルを取得せず、クローズメッセージを送信することはできません。 –

+0

@David Heffernan:短い間隔のFindWindowへの単純な呼び出しは害を与えません。 – JosephH

関連する問題