kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Silviu-Marian
Silviu-Marian
Вопрос

Кража окна в окне CreateWindow создает "замороженное" окно?

Я пытаюсь украсть окно с экрана и сделать его дочерним для моего собственного созданного окна. Когда моя программа закрывается, украденное окно тоже исчезает, возможно, вместе со своим процессом.

Вот мои вопросы:

  1. Созданное окно заморожено, оно не позволяет мне управлять его элементами управления. Не позволяет ли консоль управлять им? Если да, то как я могу это исправить?
  2. (код ниже) крадет окно только при втором запуске, при первом он этого не делает и окно все равно остается на панели задач.
  3. Я попробовал сделать то же самое, только я'украл окно Chrome в окно блокнота. Те же проблемы, и когда он все-таки украл окно, все выглядело полностью разорванным, делая браузер практически неработоспособным.

Вот'код, который я использовал (Win32 Console Application):

#include <conio.h> 
#include <stdio.h>
#include <Windows.h>
#include <winuser.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LPCWSTR sClassName = L"MyClass";

HWND CreateTheWindow(LPCWSTR WindowTitle) {

    // Create & register the class
    WNDCLASSEX WndClass;
    WndClass.cbSize = sizeof(WNDCLASSEX); WndClass.style = NULL; WndClass.lpfnWndProc = WndProc; 
    WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.lpszClassName = sClassName;
    WndClass.hInstance = NULL; WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    WndClass.lpszMenuName  = NULL;  WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClassEx(&WndClass);

    // Create & show the window
    HWND hwnd = CreateWindowEx(WS_EX_STATICEDGE, sClassName, WindowTitle, WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT, CW_USEDEFAULT, 320, 240, NULL, NULL, NULL, NULL);

    ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd);
    return hwnd;
}

// No idea what's this for, back in JS we simply had to do window.open 
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    switch(Message) {
        case WM_CLOSE: DestroyWindow(hwnd); break;
        case WM_DESTROY: PostQuitMessage(0); break;
        default: return DefWindowProc(hwnd, Message, wParam, lParam);
    }
    return 0;
}

// start
void main()
{
    HWND chrome = FindWindow(L"Chrome_WidgetWin_1", NULL);
    HWND mywin = CreateTheWindow(L"HELLO BOSS");

    if(chrome!=0) printf("Got Chrome\r\n"); else printf("Chrome not found\r\n");
    if(mywin!=0) printf("Got yours\r\n"); else printf("Your window not found\r\n");

    SetParent(chrome, mywin);
    SetWindowLong(chrome, GWL_STYLE, WS_CHILDWINDOW | WS_VISIBLE  ); 
    UpdateWindow(chrome); 
    UpdateWindow(mywin);

    _getch();
}

О BTW, пожалуйста, не спрашивайте меня, чего я'пытаюсь достичь :D Это'сюрприз.

1 2012-06-11T22:13:08+00:00 2
Программирование
winapi
c++
Решение / Ответ
Adrian McCarthy
Adrian McCarthy
11-го июня 2012 в 11:48
2012-06-11T23:48:38+00:00
Дополнительно
Источник
Редактировать
#16410520

Похоже, что вы не запускаете цикл сообщений, который необходим для вашего собственного окна и, вероятно, необходим для перекачки сообщений, которые идут между дочерним и родительским окнами. Это кажется наиболее вероятной причиной того, что украденное окно кажется заблокированным. (Могут быть и другие проблемы, но я бы начал с этого).

Попробуйте добавить базовый цикл сообщений туда, где у вас есть вызов getch:

MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0) > 0) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

Могут возникнуть дополнительные трудности. Иметь дочернее окно в другом процессе сложно из-за очереди сообщений для каждого потока. Вопреки мифам, это можно заставить работать: (многопроцессные браузеры делают это).

Возможно, вы захватываете не то окно из Chrome. Помните, что Chrome также играет в эту игру, создавая дочерние окна в отдельных процессах. Вы захватываете одно из дочерних окон или главное окно фрейма?

3
0
 Silviu-Marian
Silviu-Marian
12-го июня 2012 в 7:29
2012-06-12T07:29:05+00:00
Дополнительно
Источник
Редактировать
#16410521

В конце концов я украл окно в Блокнот. Все, что мне нужно было сделать, это избавиться от окна дочернего редактора Notepad' и проблема с краской исчезла вместе с ним.

Также хорошими стилями, которые нужно применить, являются WS_CHILD в Chrome и WS_POPUP в Notepad, за которыми следует сообщение UIS_INITIALIZE WM_CHANGEUISTATE в обоих случаях.

Я очень надеюсь, что Chrome Dev' не изменит это поведение.

введите описание изображения здесь

1
0
Похожие сообщества 9
pro.cxx
pro.cxx
5 992 пользователей
C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. No Ads, offtop, flood 2. Полные правила тут https://t.me/ProCxx/259155 Объявления о вакансиях,эвентах - в лс @AlexFails или @MasterZiV
Открыть telegram
supapro.cxx
supapro.cxx
5 026 пользователей
Чат для тех, кто немного знает C++, простые вопросы по C++, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат-флудилка — @fludpac /прогерские вопросы – @pro_prog 🚫flood, pron, spam; ✅УВАЖАЙТЕ ДРУГ ДРУГА!
Открыть telegram
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
1 393 пользователей
Лекции: www.youtube.com/playlist?list=PLRDzFCPr95fL_5Xvnufpwj2uYZnZBBnsr Практика: cs.mipt.ru/cpp_algo Спонсировать: www.paypal.me/tkhirianov Онлайн компилятор https://godbolt.org
Открыть telegram
Чат конференции C++ Russia
Чат конференции C++ Russia
1 205 пользователей
Канал конференции: @cpprussia_channel Ближайшая конференция — C++ Russia 2023, 11–12 мая · Online Оффлайн — 23–24 мая · Москва Билеты: https://tinyurl.com/CPPRussia2023 Саппорт: @JUGConfSupport_bot
Открыть telegram
Android NDK (C++) — русскоговорящее сообщество
Android NDK (C++) — русскоговорящее сообщество
783 пользователей
Общаемся на темы, посвященным Android-разработке на C++. Обмен новостями, опытом и наработками. + Про Android: @android_ru + Про iOS: @ios_ru + Канал Android: @pandroidtoday_ru + Вакансии: @mobile_jobs Рекомендуем отключить уведомления.
Открыть telegram
C++ для самых маленьких и отчаяных
C++ для самых маленьких и отчаяных
564 пользователей
Лоу левел (по среднему IQ участников) чатик По продвижению вакансий писать @vertver Флудилка чата - @hckcxx
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией