0

私のメインフォームには、ソフトウェアスイートに属するプロセスのLargeIconビューのリストを含むListViewがあります。各LV(ListView)アイテムには、それぞれのアプリケーション(MarinaOffice、LaunchOffice、PureRentalなど)のソフトウェア製品のアイコンと同じテキストと画像の両方が含まれています。Process.GetProcesses()メソッド呼び出しでプロセスが見つかったかどうかに基づいてリストを更新するタイマーがあります。ユーザーが実行中のプロセスのListViewアイテムをクリックすると、現在のプロセスの前にそのプロセス(つまり、WinFormsアプリケーション)のウィンドウが最大化されて表示されます。以下のコードは、私が達成したいことをほぼ実行しますが、表示したいアプリケーションがすでに最大化されているが、モニター上にあるWindowsアプリケーションの背後にある場合は 私が示しているプロセスをアプリケーションの前に置くことはありません。つまり、以下のWIN32メソッドを使用して示しているアプリケーションが最小化されている限り、動作します。しかし、それはすでに最大化されていますが、そうではありません。

// Used to Show Other Process Windows
private const int SW_SHOWMAXIMIZED = 3;
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);    

// Method that checks for running apps in our suite every 3000ms
private void timerRunningApps_Tick(object sender, EventArgs e)
{
    CheckRunningapps();
}

// Stripped down version of method that looks for running process in our suite and 
// adds the process name and icon to a ListView on our main form
private void CheckRunningapps()
{
    List<Process> AllProcesses = System.Diagnostics.Process.GetProcesses().ToList();

    listViewRunningApps.BeginUpdate();
    listViewRunningApps.Items.Clear();

    foreach (Process process in AllProcesses)
    {
        ListViewItem lvi = new ListViewItem();
        if (process.ProcessName.ToLower().Contains("marinaoffice"))
        {
            lvi = new ListViewItem("MarinaOffice");
            lvi.SubItems.Add("MarinaOffice");
            lvi.ImageIndex = 1;
            lvi.Tag = process;
            listViewRunningApps.Items.Add(lvi);
        }
    }

    listViewRunningApps.EndUpdate();
}

// Method that actually shows the process.  This works as long as process is minimized
// However, if the process is maximized but, merely behind the current window it does
// not bring it in front.  I have noticed that there is a ShowWindowAsync method.
// Should I use that instead?
private void listViewRunningApps_MouseDoubleClick(object sender, MouseEventArgs e)
{
    ListViewItem lvi = listViewRunningApps.GetItemAt(e.X, e.Y);
    if (lvi != null)
    {
        Process process = (Process)lvi.Tag;
        ShowWindow(process.MainWindowHandle, SW_SHOWMAXIMIZED);
    }
}
4

1 に答える 1

1

このようなことを試してみてください。ウィンドウがすでに最大化されている場合は、ShowWindow Callでウィンドウの状態を変更していないと思います。その場合は、BringWindowToTopを使用してウィンドウをZ-Orderの先頭に移動する必要もあります。方法。

Process process = (Process)lvi.Tag; 
ShowWindow(process.MainWindowHandle, SW_SHOWMAXIMIZED);
BringWindowToTop(process.MainWindowHandle); 
于 2012-10-19T03:32:29.150 に答える