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

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

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

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

Q&A

解決済

2回答

758閲覧

数秒単位で監視し特定のウインドウを開けないようにする

mercurian-teto

総合スコア75

C#

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

0グッド

0クリップ

投稿2017/09/23 07:32

数秒単位で監視し、特定のウインドウを開けないようにするプログラムを作ろうとしています。(visual studio2017で作成しています。C#コンソールアプリで作成しています。)
まず、
秒単位で一定の操作をするプログラムをベースにします
参照リンクを見てください。

これをベースに数秒単位で監視し特定のウインドウを開けないようにするプログラムを作成しようと考えました。

using何とかを追加して、

C#

1 //ここに一定時間で実行したい処理を書く 2 Console.WriteLine("{0} Checking status {0}.", 3 DateTime.Now.ToString("h:mm:ss.fff"));

ここの内容を書き換えます。

つぎに特定のウインドウが開けないようにするコードです。
例はfirefoxのアドオンマネージャーの画面
(ウインドウ名アドオンマネージャー - Mozilla Firefox)です。
プログラムは主にこのサイトを参考にしました。

下のプログラムは一応、コンパイルが通って、期待通りの操作をしました。
firefoxのアドオンマネージャーが開いているとfirefoxがまるごと
閉じられます。
また以下のコードを組み入れるときには
以下のコードのmainを別の名前に変更しなければなりません。
このリンクを参照してください。

以上のことを踏まえて作りました。

C#

1using System; 2using System.Threading; 3using System.Runtime.InteropServices; 4using System.Text; 5using System.Diagnostics; 6using System.Collections; 7 8class TimerExample 9{ 10 static void Main() 11 { 12 AutoResetEvent autoEvent = new AutoResetEvent(false); 13 StatusChecker statusChecker = new StatusChecker(); 14 15 // Create the delegate that invokes methods for the timer. 16 TimerCallback timerDelegate = 17 new TimerCallback(statusChecker.CheckStatus); 18 19 // タイマー起動 20 Console.WriteLine("{0} タイマーを起動します.\n", 21 DateTime.Now.ToString("h:mm:ss.fff")); 22 23 Timer stateTimer = 24 //最後の2つの値→初動実行までの時間,実行間隔(ミリ秒) 25 new Timer(timerDelegate, autoEvent, 0, 30); 26 27 // タイマーの待機時間は-1にすると無制限になる(有限にしたい場合はミリ秒で記述) 28 autoEvent.WaitOne(-1, false); 29 //タイマーの開放 30 stateTimer.Dispose(); 31 } 32} 33 34class StatusChecker 35{ 36 public StatusChecker() 37 { 38 } 39 40 // This method is called by the timer delegate. 41 public void CheckStatus(Object stateInfo) 42 { 43 AutoResetEvent autoEvent = (AutoResetEvent)stateInfo; 44 } 45 46 //ここに一定時間で実行したい処理を書く 47 public class Program 48 { 49 /// <summary> 50 /// エントリポイント 51 /// </summary> 52 public static void addonblock () 53 { 54 //ウィンドウのタイトルに[アドオンマネージャー]を含むプロセスをすべて取得する 55 Process[] ps = GetProcessesByWindow("アドオンマネージャー - Mozilla Firefox", null); 56 57 //結果を表示する 58 foreach (Process p in ps) 59 { 60 61 p.Kill(); 62 } 63 64 Console.WriteLine("開いてはいけません!!!!!!!!!!!!!!"); 65 Console.ReadLine(); 66 67 } 68 69 70 public static Process[] GetProcessesByWindow( 71 string windowText, string className) 72 { 73 //検索の準備をする 74 foundProcesses = new ArrayList(); 75 foundProcessIds = new ArrayList(); 76 searchWindowText = windowText; 77 searchClassName = className; 78 79 //ウィンドウを列挙して、対象のプロセスを探す 80 EnumWindows(new EnumWindowsDelegate(EnumWindowCallBack), IntPtr.Zero); 81 82 //結果を返す 83 return (Process[])foundProcesses.ToArray(typeof(Process)); 84 } 85 86 private static string searchWindowText = null; 87 private static string searchClassName = null; 88 private static ArrayList foundProcessIds = null; 89 private static ArrayList foundProcesses = null; 90 91 private delegate bool EnumWindowsDelegate(IntPtr hWnd, IntPtr lparam); 92 93 [DllImport("user32.dll")] 94 [return: MarshalAs(UnmanagedType.Bool)] 95 private extern static bool EnumWindows(EnumWindowsDelegate lpEnumFunc, 96 IntPtr lparam); 97 98 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 99 private static extern int GetWindowText(IntPtr hWnd, 100 StringBuilder lpString, int nMaxCount); 101 102 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 103 private static extern int GetWindowTextLength(IntPtr hWnd); 104 105 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 106 private static extern int GetClassName(IntPtr hWnd, 107 StringBuilder lpClassName, int nMaxCount); 108 109 [DllImport("user32.dll", SetLastError = true)] 110 private static extern int GetWindowThreadProcessId( 111 IntPtr hWnd, out int lpdwProcessId); 112 113 private static bool EnumWindowCallBack(IntPtr hWnd, IntPtr lparam) 114 { 115 if (searchWindowText != null) 116 { 117 //ウィンドウのタイトルの長さを取得する 118 int textLen = GetWindowTextLength(hWnd); 119 if (textLen == 0) 120 { 121 //次のウィンドウを検索 122 return true; 123 } 124 //ウィンドウのタイトルを取得する 125 StringBuilder tsb = new StringBuilder(textLen + 1); 126 GetWindowText(hWnd, tsb, tsb.Capacity); 127 //タイトルに指定された文字列を含むか 128 if (tsb.ToString().IndexOf(searchWindowText) < 0) 129 { 130 //含んでいない時は、次のウィンドウを検索 131 return true; 132 } 133 } 134 135 if (searchClassName != null) 136 { 137 //ウィンドウのクラス名を取得する 138 StringBuilder csb = new StringBuilder(256); 139 GetClassName(hWnd, csb, csb.Capacity); 140 //クラス名に指定された文字列を含むか 141 if (csb.ToString().IndexOf(searchClassName) < 0) 142 { 143 //含んでいない時は、次のウィンドウを検索 144 return true; 145 } 146 } 147 148 //プロセスのIDを取得する 149 int processId; 150 GetWindowThreadProcessId(hWnd, out processId); 151 //今まで見つかったプロセスでは無いことを確認する 152 if (!foundProcessIds.Contains(processId)) 153 { 154 foundProcessIds.Add(processId); 155 //プロセスIDをからProcessオブジェクトを作成する 156 foundProcesses.Add(Process.GetProcessById(processId)); 157 } 158 159 //次のウィンドウを検索 160 return true; 161 } 162 } 163} 164 165コード

コンパイルが通りましたが、うまく期待の操作ができません。
実行結果が
4:16:57.367 タイマーを起動します.
イメージ説明
と表示されたままコードが実行され続けていますが、
実行中firefoxのアドオンマネージャーの画面を開いても全く反応がありません。
(firefoxのアドオンマネージャーを開いてもfirefoxがとじられません)
だれか、解決策をご教授ください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

C#

1using System; 2using System.Diagnostics; 3using System.Threading; 4 5namespace Close_Window 6{ 7 class Program 8 { 9 static void Main() 10 { 11 new Program().Run(); 12 } 13 14 public void Run() 15 { 16 var timer = new Timer(new TimerCallback(Check_Process)); 17 Console.WriteLine("{0}タイマーを起動します", 18 DateTime.Now.ToString("h:mm:ss.fff")); 19 timer.Change(0, 1000); 20 for(;;) {}; // これがないとプログラムが終了する。 21 } 22 23 public void Check_Process(object args) 24 { 25 foreach (var p in Process.GetProcesses()) 26 if (p.MainWindowTitle == "アドオンマネージャ - Mozilla Firefox") 27 { 28 p.CloseMainWindow(); 29 Console.WriteLine("開いてはいけません" + new string('!', 14)); 30 } 31 } 32 } 33}

「アドオンマネージャ - Mozilla Firefox」という名前の
MainWindowがあるプロセスを終了させるプログラム。
ブラウザの操作ができないのでタブではなくプロセスが閉じられる。
私の環境では「アドオンマネージャー」ではなく
「アドオンマネージャ」だった。

参考:
.NET TIPS:タイマにより一定時間間隔で処理を行うには?

投稿2017/09/23 11:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/09/23 12:05

for(;;) {}; // これがないとプログラムが終了する。 の部分は「for(;;) {};」よりも「Console.ReadLine();」 の方がCPU使用率が低い。
退会済みユーザー

退会済みユーザー

2017/09/23 12:18

Thread.Sleep(Timeout.Infinite);を使うと 入力があってもプログラムが終了しない かつCPU使用率も低い。
Zuishin

2017/09/23 13:53

回答してすぐ退会してまた入会してコメントして退会して 最近こういうことを繰り返してますが何か理由があるのですか?
mercurian-teto

2017/09/23 16:16

回答ありがとうございます!!!期待のアプリが作成できました。 結局、退会済みユーザーさんにほとんど任せてしまう形になってしまいましたが、 zuishinさんのアドバイスを参考にして自分のプログラムも見直したいと思います。 皆さん回答ありがとうございました。
guest

0

addonblock がどこからも呼ばれていないように見えます。

投稿2017/09/23 09:28

Zuishin

総合スコア28660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問