C# EnumWindows示例代码

代码开箱即用,唯一需要处理的就是要提供一个进程的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上的例子:

原文地址:https://www.cnblogs.com/strive-sun/p/14578328.html