Изменить имя окна по идентификатору процесса - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь переименовать окно (или его дочернее устройство) с помощью идентификатора процесса , возможно ли это?

Ниже приведен рабочий код (метод ChangeWindowName , изменяющее окно в зависимости от имени окна. Проблема в том, что у меня много windows с точно таким же именем, поэтому я пытаюсь сделать с pId - метод ChangeWindowNameByProcessId (там не должно быть переменной windowName). Окно, которое мне нужно изменить, не является mainHandle, мне нужно получить дочерние элементы, я думаю.

И мне нужно экспортировать это как dll.

    public delegate bool EnumDelegate(IntPtr hWnd, int lParam);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool IsWindowVisible(IntPtr hWnd);

    [DllImport("user32.dll", EntryPoint = "GetWindowText",
        ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    [DllImport("user32.dll", EntryPoint = "EnumDesktopWindows",
        ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction,
        IntPtr lParam);
    [DllImport("user32.dll")]
    public static extern int SetWindowText(IntPtr hWnd, string windowName);

    public string ChangeWindowName(string windowName, string toName)
    {
        var windowNameUpper = windowName.ToUpper();
        uint pId = 0;

        EnumDelegate filter = delegate (IntPtr hWnd, int lParam)
        {
            var result = new StringBuilder(255);
            GetWindowText(hWnd, result, result.Capacity + 1);
            string title = result.ToString();
            if (title.ToUpper().Contains(windowNameUpper))
            {
                SetWindowText(hWnd, toName);
                ChangeWindowName.GetWindowThreadProcessId(hWnd, out pId);
            }

            return true;
        };

        EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero);
        return pId.ToString();
    }

    public string ChangeWindowNameByProcessId(string windowName, string toName, string pIdAAString)
    {
        var windowNameUpper = windowName.ToUpper();
        uint pId = 0;
        uint pIdAA = 0;

        EnumDelegate filter = delegate (IntPtr hWnd, int lParam)
        {
            var result = new StringBuilder(255);
            GetWindowText(hWnd, result, result.Capacity + 1);
            string title = result.ToString();
            SetWindowText(hWnd, toName);
            GetWindowThreadProcessId(hWnd, out pId);
            uint.TryParse(pIdAAString, out pIdAA);
            if (pId == pIdAA)
            {
                Console.WriteLine("Title " + title + " PID " + pIdAA);
            }
            Console.WriteLine("pId={0}, pIdAA={1}", pId, pIdAA);
            Console.ReadLine();
            }

            return true;
        };

        EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero);
        return pId.ToString();
    }
...