繁体   English   中英

如何将选定的应用程序窗口从列表框移到最前面

[英]How to bring a selected application window from a listbox to front

我有一个Windows窗体应用程序。 在列表框中,我正在其中显示所有打开的窗口的标题。 我已经做到了。 现在,我想双击列表框中的标题。这将激活该窗口并显示在前面。 我的代码是这样的:

    //this function is loading all the opened windows in the listbox 

    public void LoadOpenedWindows()
    {
        Process[] processlist = Process.GetProcesses();

        foreach (Process process in processlist)
        {
            if (!String.IsNullOrEmpty(process.MainWindowTitle))
            {
                listBox1.Items.Add(process.MainWindowTitle);

           }
        }
        listBox1.DoubleClick += new EventHandler(ListBox1_DoubleClick);

    }

我尝试通过以下方式打开选定的项目。但这不起作用。

    private void ListBox1_DoubleClick(object sender, EventArgs e)
    {
        if (listBox1.SelectedItem != null)
        {
            //MessageBox.Show(listBox1.SelectedItem.ToString());
            const uint SW_SHOW = 5;
            const int SW_RESTORE = 5;
            string selected = listBox1.SelectedItem.ToString();
            IntPtr handleOfSelected = getHandle(selected);
            ShowWindowAsync(handleOfSelected, SW_RESTORE);
            SetForegroundWindow(handleOfSelected);
            //BringWindowToTop(handleOfSelected);
            //ShowWindow(handleOfSelected, SW_SHOW);
        }
    }

    public IntPtr getHandle(string selectedItem)
    {
        IntPtr hWnd = IntPtr.Zero;
        foreach (Process pList in Process.GetProcesses())
        {
            if (pList.MainWindowTitle.Contains(selectedItem))
            {
                hWnd = pList.MainWindowHandle;
            }
        }
        return hWnd;
    }

如果有人有任何想法或一段代码..请尝试提供帮助。

这是一个很好的工作。

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace SOF_ProcessFront
{
public partial class Form1 : Form
{
    const UInt32 WS_MAXIMIZE = 365887488;
    const int GWL_STYLE = -16;
    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool ShowWindow(IntPtr wHnd, int cmdShow);
    [DllImport("user32.dll", SetLastError = true)]
    static extern int GetWindowLong(IntPtr hWnd, int nIndex);

    public Form1()
    {
        InitializeComponent();
        LoadOpenedWindows();
    }

    void bringProcessToFront(int pid)
    {
        Process proc = Process.GetProcessById(pid);
        int style = GetWindowLong(proc.MainWindowHandle, GWL_STYLE);
        ShowWindow(proc.MainWindowHandle,
            (style & WS_MAXIMIZE) == WS_MAXIMIZE ? 3 : 9 );
        SetForegroundWindow(Process.GetProcessById(pid).MainWindowHandle);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        bringProcessToFront(0);
    }

    public void LoadOpenedWindows()
    {
        Process[] processlist = Process.GetProcesses();
        foreach (Process process in processlist)
            if (!String.IsNullOrEmpty(process.MainWindowTitle))
                listBox1.Items.Add(new ProcessAttributes()
                {
                    ProcessName = process.MainWindowTitle,
                    ProcessID = process.Id
                });
        listBox1.DisplayMember = "ProcessName";
        listBox1.DoubleClick += listBox1_DoubleClick;
    }

    void listBox1_DoubleClick(object sender, EventArgs e)
    {
        bringProcessToFront(((ProcessAttributes)listBox1.SelectedItem).ProcessID);
    }

    class ProcessAttributes
    {
        public string ProcessName { get; set; }
        public int ProcessID { get; set; }
    }
}
}

我在这里为WS_MAXIMIZE使用的常量对我有用@ Win 8.1 64位我不知道您是否要找到系统编号。

ShowWindow函数设置应用程序的WindowState。 即我们需要将其状态从最小恢复到正常或最大化。 ShowWindow函数的第二个参数要求设置状态。 即3用于最大化,9用于恢复其状态。 如果应用程序未最小化并且处于最大化状态,我想在那里传递3作为参数。 如果不是,则该函数将尝试还原最大化的窗口,这将迫使其从最大化变为正常。 您也可以像仅在窗口最小化时调用showWindow函数一样。 Cauz应该最小化一个窗口以显示出来。 之后,SetForegroundWindow将窗口移到最前面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM