Можно ли добавить управление в окно другого процесса?

Я создал окно MFC и из другого проекта хотел добавить кнопку в это окно через его дескриптор (используя FindWindow). Ручка правильная, но ничего не происходит. Это недостижимо или я что-то не так делаю?

Вот мой код:

HWND hWnd = FindWindow(NULL, "MFCtest");
if(hWnd)
{
    printf("Found it\n");
    HWND hwndButton = CreateWindow( 
        "BUTTON",
        "OK",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles 
        0,         // x position 
        0,         // y position 
        100,        // Button width
        100,        // Button height
        hWnd,     // Parent window
        NULL,       // No menu.
        (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 
        NULL);      // Pointer not needed.

    if(!hwndButton)
        printf("GetLastError: %d\n", GetLastError());
}

person conectionist    schedule 29.01.2015    source источник
comment
подозреваю что нельзя   -  person o_weisman    schedule 29.01.2015
comment
Окно, которое вы создаете, находится в другом потоке, на самом деле, в другом процессе от пользовательского интерфейса. Это никогда не заканчивается хорошо. Система не ожидает от вас подобных действий.   -  person David Heffernan    schedule 29.01.2015
comment
Прочтите блог Рэймонда Чена, чтобы некоторое релевантное понимание.   -  person Roger Rowland    schedule 29.01.2015
comment
@o_weisman: ТАК не в догадках. Поскольку вы ошиблись, вы можете также удалить этот комментарий.   -  person IInspectable    schedule 30.01.2015
comment
@IInspectable Возможно, моя формулировка была неправильной, подозреваемый хотел сказать, насколько мне известно. Мне еще предстоит увидеть ответ, который показывает, как это можно сделать, чтобы это действительно работало хорошо, поэтому я жду, чтобы доказать свою неправоту. Случайно, кто-то умер и оставил вас ответственным за SO?   -  person o_weisman    schedule 01.02.2015
comment
@o_weisman: Нет технической причины, препятствующей иерархии окон между потоками. Поскольку вы хотите доказать: Законно ли иметь крест -обработать отношение родитель/потомок или владелец/владелец окна? (уже предоставлено Роджером выше). Причина, по которой вы не видите ответа на этот конкретный вопрос, заключается в обстоятельствах: чтобы это работало надежно, вы должны контролировать все участвующие потоки. Этот вопрос возникает, когда вы не контролируете целевой поток.   -  person IInspectable    schedule 01.02.2015


Ответы (1)


да. НО!

Проблема в том, что окно всегда принадлежит потоку, который его создает. Таким образом, сообщения для таких управляющих сообщений будут поступать в поток, который создает такое окно.

Это может сработать, но поскольку сообщения из родительского окна будут отправлены дочернему, они пройдут долгий путь через очередь сообщений и могут вызвать блокировки, если сообщение не может быть получено и обработано напрямую.

Итак, в конце я хотел бы предложить: Не делайте этого!

person xMRi    schedule 29.01.2015
comment
При создании окна WS_CHILD из потока, отличного от его родительского окна, система автоматически вызывает AttachThreadInput. Следовательно, входящие сообщения будут совместно использовать одну очередь, независимо от потока, которому принадлежит окно получателя. - person IInspectable; 29.01.2015