2015-03-07 2 views
1

У меня есть приложение для окон. В котором в списке я показываю заголовок всех открытых окон. Я сделал это. Теперь я хочу дважды щелкнуть по названию в списке .. и это активирует это окно и отобразит аванс. Мой код выглядит так ::Как перенести выбранное окно приложения из списка на передний план

//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; 
    } 

Если кто-нибудь есть какие-либо идеи или кусок кода .. Пожалуйста, попробуйте помочь.

ответ

1

Вот хороший работает один ..

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 бит Я Donno имею ли вы найти номер для вашей системы ,

Функция ShowWindow устанавливает WindowState приложения. то есть нам нужно восстановить его состояние от минимального до нормального или максимизированного. Второй параметр функции ShowWindow запрашивает состояние. т. е. 3 для максимизации и 9 для восстановления его состояния. Я хотел бы передать 3 как параметр там, если приложение не сведено к минимуму и находится в максимизированном состоянии. Если нет, то функция попытается восстановить максимально развернутое окно, которое заставляет его перейти от максимизированного к нормальному. Вы также можете использовать функцию showWindow только в том случае, если окно минимизировано. Cauz свернутое окно должно быть восстановлено. После этого SetForegroundWindow выведет окно вперед.

+0

Большое спасибо Sayka .. Это работает отлично. – Jaideep

+0

У меня есть некоторые вопросы. Не могли бы вы объяснить функцию bringProcessToFront. Специально функция ShowWindow. – Jaideep

+0

Добро пожаловать в jaideep. Я добавил объяснение. – Sayka

Смежные вопросы