Я пытаюсь переименовать окно (или его дочернее устройство) с помощью идентификатора процесса , возможно ли это?
Ниже приведен рабочий код (метод 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();
}