Re[4]: Кликнуть в скрытое окно
От: Cannol  
Дата: 06.08.19 20:21
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:
MA> Сильно-отрицательные координаты (при постоянном видимом окне) как раз должны бы работать. Что если вообще сделать нормально видимым — принимает ли оно ввод? А если оставить пару пикселов?
Только что проверил еще раз: [-3000, -3000] при нормально видимом окне не работает. Координаты в SetCursorPos проверил — там везде в районе [-3000 плюс смещение].
А фактически при любых отрицательных координатах клика я вижу, что генерируется клик на левый верхний угол приложения (где [0,0]) и открывает системное меню окна.


Вчера еще забыл упомянуть, в том коде:
static int PosX = 30;
static int PosY = PosX;
static UINT uFlags = 0;
SetWindowPos(hwnd, HWND_TOP, PosX, PosY, nSizeX, nSizeY, uFlags);

когда координаты входят в видимую область экрана, то клики проходят. Даже когда какой-нибудь [2500,20], который всё равно в зоне видимости (там у меня второй монитор), тоже ввод принимает.
А когда я рантайм меняю их на более отдалённые — ввод уже перестает работать.
И ЕМНИП, когда виден лишь кусочек окна в углу экрана — работает частично, только на размер этого видимого куска.


C>>ЗЫ. Нагуглил еще AttachThreadInput()

MA> Тут, по идее это лишнее, если IE создает окно связанное с твоим потоком. Если же со своим — тогда стоит покопать в этом направлении.
Создаю новый поток, и уже с этого нового потока линкуюсь к браузеру и т.д.:
    if (byCodeOption == 102) //  moved to a separate thread
    {
        void * hUpdateThread = (HANDLE)_beginthread(BrowserThread, 0, (void *)0);
        const DWORD dwCurrentThread = GetCurrentThreadId();
        if (webBrowser1)
        {
            HWND hWnBrwsr;
            webBrowser1->GetWindow(&hWnBrwsr);
            hUpdateThread = (void *)GetWindowThreadProcessId(hWnBrwsr, NULL);
        }
        AttachThreadInput(dwCurrentThread, (DWORD) hUpdateThread, TRUE);
    }
    else
        CreateBrowser();

Тут пока разбираюсь.

MA> PS: В дополнение ко всему IE наверняка еще и вызывает что-то на подобии GetKeyState для определения состояния клавиш-модификаторов, в том числе и мышиных (VK_LBUTTON). Он вполне может реагировать на внешние события как триггер обработки клавиатуры/мышки, ставить в очередь, и дочитывать реальное/текущее состояние для фильтрации событий совсем чуток погодя. Таким образом если вы пробрасываете настоящие нажатия — оно будет/должно работать, а если синтезируете события полностью программно, то не будет.

Намекните, пожалуйста, что за настоящие нажатия имеются в виду? На уровне драйвера мыши?

MA> PPS: Не меняет ли IE размер своего окна на 0х0 в случае, если окно прячется?

Надо бы попробовать в Spy++.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.