数秒単位で監視し、特定のウインドウを開けないようにするプログラムを作ろうとしています。(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がとじられません)
だれか、解決策をご教授ください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/23 12:05
退会済みユーザー
2017/09/23 12:18
2017/09/23 13:53
2017/09/23 16:16