代码开箱即用,唯一需要处理的就是要提供一个进程的pid。
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Runtime; usingSystem.Runtime.InteropServices; usingSystem.Diagnostics; namespaceEnumPTW { classProgram { [DllImport("user32.dll", SetLastError = true)] static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uintlpdwProcessId); //Callback Declaration public delegate bool EnumWindowsCallback(IntPtr hwnd, intlParam); [DllImport("user32.dll")] private static extern int EnumWindows(EnumWindowsCallback callPtr, intlParam); [DllImport("user32.dll", SetLastError = true)] internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, boolbRepaint); public static bool ReportWindow(IntPtr hwnd, intlParam) { uint processId = 0; uint threadId = GetWindowThreadProcessId(hwnd, outprocessId); 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 = newEnumWindowsCallback(ReportWindow); EnumWindows(callBackFn, 0); Console.WriteLine("Finished. Press any key to continue."); Console.ReadKey(); } } }
一些github上的例子: