現在、WPF でクリック イベントを使用して Windows タスク マネージャーを呼び出しています。このイベントは、'Process.Start("taskmgr") を実行するだけです。
私の質問は、プロセスの開始/表示時にタスクマネージャー内のどのタブが選択されるかを選択する方法はありますか? クリックイベントが発生するたびに「パフォーマンス」タブが自動的に選択されるようにしています。
助けてくれてありがとう。
現在、WPF でクリック イベントを使用して Windows タスク マネージャーを呼び出しています。このイベントは、'Process.Start("taskmgr") を実行するだけです。
私の質問は、プロセスの開始/表示時にタスクマネージャー内のどのタブが選択されるかを選択する方法はありますか? クリックイベントが発生するたびに「パフォーマンス」タブが自動的に選択されるようにしています。
助けてくれてありがとう。
Philipp Schmidの投稿を拡張するために、私は小さなデモを作成しました。
コンソールアプリケーションとして実行します。とへの参照を追加する必要がUIAutomationClient
ありUIAutomationTypes
ます。
あなた(またはあなたが望むなら私)が行うことができる1つの可能な改善は、最初にウィンドウを非表示にし、正しいタブが選択された後にのみウィンドウを表示することです。それがうまくいくかどうかはAutomationElement.FromHandle
わかりませんが、隠されたウィンドウを見つけることができるかどうかはわかりません。
編集:少なくとも私のコンピューター(Windows 7、32ビット、.Net Framework 4.0)では、次のコードは最初に非表示のタスクマネージャーを作成し、正しいタブが選択された後に表示します。[パフォーマンス]タブを選択した後、ウィンドウを明示的に表示しないので、おそらく自動化ラインの1つが副作用として表示されます。
using System;
using System.Diagnostics;
using System.Windows.Automation;
namespace ConsoleApplication2 {
class Program {
static void Main(string[] args) {
// Kill existing instances
foreach (Process pOld in Process.GetProcessesByName("taskmgr")) {
pOld.Kill();
}
// Create a new instance
Process p = new Process();
p.StartInfo.FileName = "taskmgr";
p.StartInfo.CreateNoWindow = true;
p.Start();
Console.WriteLine("Waiting for handle...");
while (p.MainWindowHandle == IntPtr.Zero) ;
AutomationElement aeDesktop = AutomationElement.RootElement;
AutomationElement aeForm = AutomationElement.FromHandle(p.MainWindowHandle);
Console.WriteLine("Got handle");
// Get the tabs control
AutomationElement aeTabs = aeForm.FindFirst(TreeScope.Children,
new PropertyCondition(AutomationElement.ControlTypeProperty,
ControlType.Tab));
// Get a collection of tab pages
AutomationElementCollection aeTabItems = aeTabs.FindAll(TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty,
ControlType.TabItem));
// Set focus to the performance tab
AutomationElement aePerformanceTab = aeTabItems[3];
aePerformanceTab.SetFocus();
}
}
}
タスクマネージャの以前のインスタンスを破棄するのはなぜですか?インスタンスがすでに開いている場合、セカンダリインスタンスは開きますが、すぐに閉じます。私のコードはこれをチェックしないので、ウィンドウハンドルを見つけるコードはフリーズします。
taskmgr.exe には、選択したタブを指定するためのコマンド ライン引数がありませんが、Windows UI オートメーションを使用してパフォーマンス タブに移動できます。
残念ながら、taskmgr.exe
コマンド ライン引数はサポートされていません。
実行すると、最後に閉じたときにアクティブだったタブが常にアクティブになります。
Windows 10 ビルド 18305 以降では、優先タブを設定して、既定でタスク マネージャーを開くことができるようになりました。
更新するには:
StartUpTab
更新後、Win レジストリ キー
の dword 値を変更します。HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\TaskManager
0 – Processes tab
1 – Performance tab
2 – App history tab
3 – Startup tab
4 – Users tab
5 – Details tab
6 – Services tab
勝利コマンド:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\TaskManager /v "startup" /t REG_DWORD /d "1"
この (実験的な) 機能は、一部の Windows Insider のみが利用できます。
Win 10 の古いビルドでは、「スタートアップ」以外のタブはサポートされていません。
taskmgr /4 /startup
リセットするには:
reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\TaskManager /v "Preferences" /f
変更されたキーを確認するには:
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit" /v "LastKey" /d "HKCU\Software\Microsoft\Windows\CurrentVersion\TaskManager" /f & regedit
Win 10 CMD でテスト済み