Рисование линии на рабочем столе очень медленно в Win 7

#windows #delphi #winapi #windows-7 #windows-7-x64

#Windows #delphi #winapi #windows-7 #windows-7-x64

Вопрос:

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

Инициализация:

 ScreenDC := GetDcEx(GetDesktopWindow,0,DCX_LOCKWINDOWUPDATE);

PenHandle := CreatePen(PS_SOLID,HitStorage.GetPenWidth,10);

SelectObject(ScreenDC ,PenHandle);
OldPenMode := SetRop2(ScreenDC, R2_NOTXORPEN);  // Setting the PenMode to NotXor

MoveToEx(ScreenDC, X, Y, Nil); //Move The Pen Position to the Cursor Position
  

Я использую этот код при каждом движении мыши:

 LineTo(ScreenDC, X, Y); // Draw a Line between the prev Point to Current Point
  

Этот код работал в Windows 95, 98, 2000 и XP, но теперь в Windows 7 он работает очень медленно.

Я написал программу для жестикуляции мышью (написанную в 1999 году) на Delphi 3, используя ТОЛЬКО Windows API (mouse hook был написан в VC из-за ОШИБКИ Delphi в версии 3). Эта программа делает именно то, что делает StrokeIt, но каким-то образом StrokeIt удалось найти решение этой проблемы.

Мой код написан на Delphi, но ответ на любом языке будет оценен по достоинству!

Я объясню более подробно, что именно я пытаюсь создать. мое приложение разделено на три части :

  1. Отслеживание жестов мыши и сохранение при нажатии правой кнопки мыши
  2. Распознавание жестов на основе ограниченного числа фигур
  3. Активация макроса на основе распознанного жеста и приложения, которое находилось под курсором при запуске жеста

У меня возникли проблемы с тем, чтобы часть 1 работала на Windows7 (Vista), и, как написал Мартин в своем ответе, я думаю, мне нужно изменить концепцию. Теперь я выполняю отслеживание, подключая сообщения мыши и рисуя жесты с помощью кода, который я прикрепил выше… Я понял основы многоуровневой Windows, но что будет работать для меня? как вы думаете, создание самого прозрачного окна в полноэкранном режиме и рисование в нем справятся с задачей? может кто-нибудь помочь мне написать код для этого?

Ответ №1:

До Windows Vista рабочий стол рисовался как настоящая поверхность GDI, и поэтому такого рода действия работали, хотя скорость их выполнения зависела от ускорения вашего драйвера GDI.

В Vista и за ее пределами Диспетчер окон рабочего стола использует DX для объединения нескольких окон (некоторые из которых могут использовать GDI, а некоторые — нет) в единую финальную сцену, которая отображается в более новой модели драйвера. В результате прямое нажатие на пиксели экрана становится намного медленнее.

Что еще более важно, это не способ добиться цели. Мне не совсем понятно, что вы пытаетесь создать, но вы, вероятно, хотите узнать о многоуровневых окнах: http://msdn.microsoft.com/en-us/library/ms997507.aspx которые предоставляют поддерживаемый и подходящий способ создания более сложных сцен поверх реальных приложений. Они также должны помочь вам избежать использования мыши, что также является плохой идеей.

Мартин

Комментарии:

1. Я добавил некоторые пояснения в свой вопрос, вы можете просмотреть его?

2. Похоже, следующим шагом будет загрузка некоторого примера кода многоуровневого окна и понимание того, как они работают на практике. У меня нет времени писать код для вас, извините.