2012-09-01 65 views
-2

我要檢查這個代碼,看看,如果你能幫助它握住手柄操縱窗口/進程(即使沒有標題或窗口)

如果是我實現, 是有沒有辦法查詢更快的獲取僅 以「一」開始,過程以「b」

開始處理(是它利用filter參數)

可以將它通過其他方法來實現與由

所需的參數

我怎麼能叫EnumDesktopWindows()另一個可能不僅使用本機方法 - 如提到的過濾... kind'a「幫手」的方法

private const string USER32 = "user32.dll"; 

    internal delegate bool EnumDelegate(IntPtr hWnd, int lParam); 

    [DllImport(WindowsFunctions.USER32, EntryPoint = "GetWindowText", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)] 
    internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount); 

    [DllImport(WindowsFunctions.USER32)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool IsWindowVisible(IntPtr hWnd); 

    [DllImport(WindowsFunctions.USER32)] 
    internal static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId); 

    [DllImport(WindowsFunctions.USER32)] 
    internal static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpfn, IntPtr lParam); 







public class WindowData 
{ 
    public string Title { get; set; } 
    public long ProcessId { get; set; } 
    public long ThreadId { get; set; } 
    public IntPtr HWindow { get; set; } 
} 


     var collection = new List<WindowData>(); 

     EnumDelegate filter = delegate(IntPtr hWnd, int lParam) 
     { 
      StringBuilder strbTitle = new StringBuilder(255); 
      int nLength = WindowsFunctions.GetWindowText(hWnd, strbTitle, strbTitle.Capacity + 1); 
      string strTitle = strbTitle.ToString(); 

      if (IsWindowVisible(hWnd) && !string.IsNullOrEmpty(strTitle)) 
      { 
       int pid; 
       int threadId = WindowsFunctions.GetWindowThreadProcessId(hWnd, out pid); 

       collection.Add(new WindowData() 
       { 
        Title = strbTitle.ToString(), 
        ProcessId = pid, 
        ThreadId = threadId, 
        HWindow = hWnd 
       }); 
      } 

      return true; 
     }; 



     if (EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero)) 
     { 
      return collection.ToArray(); 
     } 

     return null; 
    } 
+2

請問一個簡短而直接的問題。 –

+0

這裏真的沒有問題。你的問題真的是「如何執行最後一段代碼?」如果是的話,請刪除**全部**問題的其餘部分,然後問這個問題。 –

+0

不是內在的,我是在問一個優雅的方式來查詢這個「迷失」的hWnd如何以最光滑的方法獲取它你會用你的經驗使用不安全的代碼來獲得更多的性能,你會選擇什麼樣的方法,關於最後一個我發佈的想法使用pinvoke將做的工作,正如我所提到的,優雅而性能優化,如果這個代碼(最後)會做我會很想看看如何,但主要的是你會選擇什麼怎麼做? – LoneXcoder

回答

0

這就是我想出了臨時解決方案

public static class MyProc 
    { 
     public static IntPtr WoWhWnd; 
     public static string WoWProcName; 
     public static string WowMainWinTitle; 
     public static int WowID; 
     public static IntPtr MyApphWnd; 
     public static string MyAppProcName; 
     public static string MyAppMainWinTitle; 
     public static int MyAppID; 
    } 


    public void bring(string handletoFront) 
    { 
     switch (handletoFront) 
     { 
      default: 

       SetForegroundWindow(MyProc.WoWhWnd); 

       break; 
      case "MyApp": 

       SetForegroundWindow(MyProc.MyApphWnd); 
            break; 
     } 


    } 


      #region <<=========== Enumerating Processes ============>> 

     void ShowP1(){ 

      IEnumerable<Process> processes = from p in Process.GetProcesses() where p.ProcessName.StartsWith(TBXSearchWindowTerm.Text) || p.ProcessName.StartsWith("WindowsF") orderby p.ProcessName select p; 
      MyProc.MyApphWnd = processes.ElementAt(1).MainWindowHandle; 
      MyProc.MyAppMainWinTitle = processes.ElementAt(1).MainWindowTitle; 
      MyProc.MyAppID = processes.ElementAt(1).Id; 
      MyProc.WoWhWnd = processes.ElementAt(0).MainWindowHandle; 
      MyProc.WowMainWinTitle = processes.ElementAt(0).MainWindowTitle; 
      MyProc.WowID = processes.ElementAt(0).Id; 
      pause(350); 
      SetForegroundWindow(MyProc.WoWhWnd); 
      pause(850); 
      SetForegroundWindow(MyProc.MyApphWnd); 
     } 

在queryies之一,我已經使用文本框值,它可能是一個不斷探索和動態可選的一個,如果你看到的財產以後,我做錯了什麼或者我可以做的更好,請大家評論。謝謝 。