我怎么能find所有的窗口使用C#特定的进程创build?
UPDATE
我需要使用应用程序的PID (进程ID)枚举属于特定进程的所有窗口。
wpf窗口位置的问题
ngen如何工作?
如何在一个或多个for循环中使用现有的variables?
我在哪里可以find@R_502_6308@ Server版本的友好的string?
限制在MS脚本引擎中使用名称空间
SymFromAddr使用C#
告诉Process.Start等待,直到前一个实例完成
向GAC注册/安装大会的“正确”方式是什么?
Windows硬重启
Windows语音识别 – 在API中使用本机命令/对话框
使用Win32 API EnumWindows (如果你想要子窗口EnumChildWindows )),或者你也可以使用EnumThreadWindows 。
[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=true)] public static extern bool EnumWindows(EnumThreadWindowsCallback callback,IntPtr exTradata);
然后使用Win32 API GetwindowThreadProcessId检查每个窗口属于哪个进程
[DllImport("user32.dll",SetLastError=true)] public static extern int GetwindowThreadProcessId(HandleRef handle,out int processId);
delegate bool EnumThreadDelegate(IntPtr hWnd,IntPtr lParam); [DllImport("user32.dll")] static extern bool EnumThreadWindows(int dwThreadId,EnumThreadDelegate lpfn,IntPtr lParam); static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId) { var handles = new List<IntPtr>(); foreach (Processthread thread in Process.GetProcessById(processId).Threads) EnumThreadWindows(thread.Id,(hWnd,lParam) => { handles.Add(hWnd); return true; },IntPtr.Zero); return handles; }
和样本用法:
private const uint WM_GETTEXT = 0x000D; [DllImport("user32.dll",CharSet = CharSet.Auto)] static extern IntPtr SendMessage(IntPtr hWnd,uint Msg,int wParam,StringBuilder lParam); [STAThread] static void Main(string[] args) { foreach (var handle in EnumerateProcessWindowHandles( Process.GetProcessesByName("explorer").First().Id)) { StringBuilder message = new StringBuilder(1000); SendMessage(handle,WM_GETTEXT,message.Capacity,message); Console.WriteLine(message); } }
古代的线程,但它让我开始,所以这里有一个小的实用程序功能,将找到一个匹配lambda(谓语)的子窗口。 易于更改返回列表。 在谓词中处理多个标准。
public delegate bool Win32Callback(IntPtr hwnd,IntPtr lParam); [DllImport("user32.Dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool EnumChildWindows(IntPtr parentHandle,Win32Callback callback,IntPtr lParam); /// <summary> /// Find a child window that matches a set of conditions specified as a Predicate that receives hWnd. Returns IntPtr.Zero /// if the target window not found. Typical search criteria would be some combination of window attributes such as /// ClassName,Title,etc.,all of which can be obtained using API functions you will find on pinvoke.net /// </summary> /// <remarks> /// <para>Example: Find a window with specific title (use Regex.IsMatch for more sophisticated search)</para> /// <code lang="C#"><![CDATA[var foundHandle = Win32.FindWindow(IntPtr.Zero,ptr => Win32.GetwindowText(ptr) == "Dashboard");]]></code> /// </remarks> /// <param name="parentHandle">Handle to window at the start of the chain. Passing IntPtr.Zero gives you the top level /// window for the current process. To get windows for other processes,do something similar for the FindWindow /// API.</param> /// <param name="target">Predicate that takes an hWnd as an IntPtr parameter,and returns True if the window matches. The /// first match is returned,and no further windows are scanned.</param> /// <returns> hWnd of the first found window,or IntPtr.Zero on failure </returns> public static IntPtr FindWindow(IntPtr parentHandle,Predicate<IntPtr> target) { var result = IntPtr.Zero; if (parentHandle == IntPtr.Zero) parentHandle = Process.GetCurrentProcess().MainWindowHandle; EnumChildWindows(parentHandle,(hwnd,param) => { if (target(hwnd)) { result = hwnd; return false; } return true; },IntPtr.Zero); return result; }
例
var foundHandle = Win32.FindWindow(IntPtr.Zero,ptr => Win32.GetwindowText(ptr) == "Dashboard");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。