開いているフォルダーのリストを取得し、それを列挙して、各フォルダーをプログラムで最小化するにはどうすればよいですか?
アプリケーション内のあるフォームから別のフォームにジャンプするときに、開かれている一部のフォルダーがツールからフォーカスを盗むことがあります。これを防ぐことは、クライアントにとって最優先事項です。顧客は視覚障害者であるため、スクリーン リーダーを介してのみマシンにアクセスします。他のウィンドウ (フォルダー) を最小化することはまったく問題ではなく、実際には要件です。
私はこれを試しました:
foreach (Process p in Process.GetProcessesByName("explorer"))
{
p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
}
さすがにダメでした。
更新:
ここの回答から、私はこれを試しました:
delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);
static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processID)
{
List<IntPtr> handles = new List<IntPtr>();
EnumThreadDelegate addWindowHandle = delegate(IntPtr hWnd, IntPtr param)
{
handles.Add(hWnd);
return true;
};
foreach (ProcessThread thread in Process.GetProcessById(processID).Threads)
EnumThreadWindows(thread.Id, addWindowHandle, IntPtr.Zero);
return handles;
}
const int SW_MINIMIZED = 6;
[DllImport("user32.dll")]
static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
private void button1_Click(object sender, EventArgs e)
{
foreach (IntPtr handle in EnumerateProcessWindowHandles(Process.GetProcessesByName("explorer")[0].Id))
ShowWindow(handle, SW_MINIMIZED);
}
これにより、目に見えないエクスプローラーウィンドウが大量に作成され、どこからともなくタスクバーに突然リストされます。私は Windows API を扱うのが少し苦手なので、コード自体が実際に役に立ちます。