Tim Simonetti Ответов: 2

Курсор мыши и CAPTUREBLT


МБУЭ - спасибо. Я попробовал, и он действительно идентифицирует некоторые "слоистые" / "прозрачные" окна, но не все. У меня есть Sony Vaio, и когда у меня работает утилита Vaio Gate (кажущаяся прозрачной), она никогда не помечается. Есть какие-нибудь мысли???

*************************************************************************************************************************

Есть ли способ определить, видны ли прозрачные и многослойные окна на рабочем столе? Если бы вы могли это сделать, вы могли бы условно BitBlt (с CAPTUREBLT или без него). Это не уберет, но уменьшит мерцание.

*************************************************************************************************************************


Кто-нибудь придумал решение проблемы BitBlt CAPTUREBLT / Mouse Cursor Flicker?

Благодаря исследованиям я определил, почему курсор мыши мерцает (BitBlt HIDE/SHOW cursor), но это настоящий MS-Хак. Почему они этого не сделали, по крайней мере, обеспечить передачу битовых блоков между CAPTUREBLT в<мыши&ГТ; и флаг CAPTUREBLT&ЛТ;без мыши&ГТ; флаг – не ракетостроение???

Если у вас есть решение, Пожалуйста, ответьте на [removed_email]@gmail.com (я путешествую, и это самый простой контакт)

Заранее благодарю вас.

walterhevedeich

Пожалуйста, не публикуйте свой адрес электронной почты. Если у кого-то есть решение вашей проблемы, они ответят здесь.

Tim Simonetti

Я здесь не для того, чтобы шлепать по коже - просто чтобы получить решение.

mbue

Было бы лучше разместить ответ на моем посту, чтобы я был уведомлен об этом.
Действительно, существует возможность создания прозрачных окон с использованием непрямоугольных областей. это пришло из win95. эти окна прозрачны в той части, которая находится за пределами области (например, круглые углы рамок win-xp). чтобы найти такие окна, вы должны перечислить все окна (EnumWindows) и изучить область windows.
с уважением.

Tim Simonetti

MBUE - ты лучший. Большое спасибо - я попробую это сделать.

Ваше здоровье!

2 Ответов

Рейтинг:
2

Emilio Garavaglia

Как MS написала свой код-это то, что вы должны спросить у MS, а не здесь.
Я предполагаю, что "мышь" (то есть аппаратное устройство) не имеет к этому никакого отношения.
"Курсор" (который представляет собой положение мыши, и это то, о чем вы должны более правильно говорить) отмечает больше, чем значок на экране. Если вы Блит-то еще над чем-то, это будет покрыто. Он появится снова, когда система будет вынуждена (движением мыши или скрытием/отображением) повторно его заблокировать.
Дело не в ракетах, а в физике.

Конечно, MS может сделать api, который автоматически перезаписывает мышь после blit, но blit не обязательно пишет на экране. Курсор-это просто еще одна вещь, не связанная с обработкой изображений. Написание такого API нарушает инкапсуляцию двух концепций.


Tim Simonetti

Комментарий MS был просто риторическим. Если вы загуглите этот вопрос, то это очень реальная проблема программирования. Проблема в том, что внутренне MS делает ShowCursor (FALSE) / ShowCursor (TRUE) каждый раз, когда вы BitBlt – это создает мигающий курсор. Мой вопрос в основном заключается в том, нашел ли кто-нибудь программное решение/обходной путь к этой проблеме.

Emilio Garavaglia

Я понял вашу точку зрения (мой ответ столь же риторичен...), но для проблемы, которую вы ставите, не может быть никакого "обходного пути программирования", поскольку это связано с тем, что аппаратное обеспечение не имеет понятия "курсор мыши": это просто картинка, которую программное обеспечение рисует на нем. И это противоречит любому другому программному обеспечению, используемому на нем!

Tim Simonetti

Я слышу, что ты говоришь. Я создал спрайт-курсор, который следовал за курсором и динамически принимал внешний вид курсора. Это работает довольно хорошо, но не идеально. Я знаю, что проблема MS BitBlt не может быть исправлена (за пределами MS) – просто любопытно, работал ли кто-нибудь вокруг нее.

Рейтинг:
2

mbue

if(WS_EX_LAYERED & GetWindowLong(hwnd,GWL_EXSTYLE))
{
  // <- layered window
}

if(WS_EX_TRANSPARENT & GetWindowLong(hwnd,GWL_EXSTYLE))
{
  // <- transparent window
}

CAPTUREBLT всегда без формы курсора мыши. начиная с windows 3.1 и карт grapic с аппаратными возможностями наложения, вы не должны скрывать курсор, как это следует делать в windows 3.0 перед рисованием. именно по этой причине не было никакого мерцания курсора мыши в любом случае. за исключением того, что курсор скрыт и показан программой, возможно, на сообщении WM_SETCURSOR. функция print screen делает это по традиционным причинам. если вам нужна форма курсора, вы должны нарисовать ее сами.
С уважением.