-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;
}
請問一個簡短而直接的問題。 –
這裏真的沒有問題。你的問題真的是「如何執行最後一段代碼?」如果是的話,請刪除**全部**問題的其餘部分,然後問這個問題。 –
不是內在的,我是在問一個優雅的方式來查詢這個「迷失」的hWnd如何以最光滑的方法獲取它你會用你的經驗使用不安全的代碼來獲得更多的性能,你會選擇什麼樣的方法,關於最後一個我發佈的想法使用pinvoke將做的工作,正如我所提到的,優雅而性能優化,如果這個代碼(最後)會做我會很想看看如何,但主要的是你會選擇什麼怎麼做? – LoneXcoder