代码开箱即用,唯一需要处理的就是要提供一个进程的pid。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime; using System.Runtime.InteropServices; using System.Diagnostics; namespace EnumPTW { class Program { [DllImport("user32.dll", SetLastError = true)] static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); // Callback Declaration public delegate bool EnumWindowsCallback(IntPtr hwnd, int lParam); [DllImport("user32.dll")] private static extern int EnumWindows(EnumWindowsCallback callPtr, int lParam); [DllImport("user32.dll", SetLastError = true)] internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); public static bool ReportWindow(IntPtr hwnd, int lParam) { uint processId = 0; uint threadId = GetWindowThreadProcessId(hwnd, out processId); if(processId == 23272) //23272: another program pid { Console.WriteLine(string.Format("Enumerated Window Handle 0x{0:X8}, Process {1}, Thread {2}", hwnd.ToInt32(), processId, threadId)); MoveWindow(hwnd, 100, 100, 800, 600, true); } return true; } static void Main(string[] args) { // Have to declare a delegate so that a thunk is created, so that win32 may call us back. EnumWindowsCallback callBackFn = new EnumWindowsCallback(ReportWindow); EnumWindows(callBackFn, 0); Console.WriteLine("Finished. Press any key to continue."); Console.ReadKey(); } } }
一些github上的例子: