Forum

Пожалуйста or Регистрация для создания сообщений и тем.

Прикрепить форму к окну другого процесса

Всем привет! Ребятки подскажите пожалуйста, возможно подобное кто-то у себя в проектах реализовывал или знает как реализовать)
В общем, как прикрепить форму к окну другого процесса, т.е. чтобы форма была внутри самого процесса, например блокнот.

Я пробовал так, но форму я там свою не нашел, даже координаты окна менял, не помогло.
Пример:

public static bool setParentWindow(IntPtr hWndChild, IntPtr hWndNewParent)
{
IntPtr previousParent = SetParent(hWndChild, hWndNewParent);
return (previousParent == null ? false : true);
}

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

setParentWindow(myWindowHwnd, newParentHwnd);

Фото примера:

[MNotice]Как оформлять свои темы и комментарии[/MNotice]

Привет 🖐
Это вообще довольно странная задача (подробнее). Мне кажется, что сама идея того, что ты пытаешься сделать крайне похожа на process injection. Если же тебе нужно только отображать информацию, то это уже своего рода overlay, библиотеки которых легко найти.
Что касается SetParent, на простом примере всё работает, перепроверь, что ты передаёшься корректные аргументы и что процессы завершили свою инициализацию.
Хотя как ни крути, атрибуты стилей Windows для дочернего окна поломались.

Пример

[DllImport("user32")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

public static void Main()
{
    var parent = GetInitializedProcess("notepad");
    var child = GetInitializedProcess("notepad");

    SetParent(child.MainWindowHandle, parent.MainWindowHandle);
}

private static Process GetInitializedProcess(string fileName)
{
    const int maxTimeoutInMs = 1000;

    var process = Process.Start(fileName);
    if (!process.WaitForInputIdle(maxTimeoutInMs))
    {
        throw new InvalidOperationException();
    }

    return process;
}


Привет🖐
Большое спасибо за развернутый ответ, с ссылками и примером!
Результат был необходим как с оверлеем, ссылку которую ты так же при крепил.
Буду копать в эту сторону)

@dapofig Привет
Выше ты давал ссылку на готовую библиотеку overlay, которая на WPF, подскажи пожалуйста с окном Windows Forms это возможно совместить, если да то как?
Не мог бы ты показать пример?

Привет 🖐
Да, конечно, без каких-либо проблем. Демо проект из репозитория для простоты использует обычную консоль. Если есть сложности с чтением кода, можно поставить breakpoint в Program.Main() и с отладчиком посмотреть, как и какие классы используются, какие методы вызываются и т.д. Саму библиотеку установить в проект можно через пакетный менеджер NuGet или скачать репозиторий, скомпилировать и уже в своём проекте в Dependencies добавить ссылку на скомпилированную библиотеку.

P.S. Проект давно не обновляется и не распространяет лицензию. Поэтому необязательно использовать именно эту библиотеку, есть ряд других, в том числе с весьма понятными примерами использования и под MIT лицензией.