windows - 在 Win 7 上在桌面上画线非常慢

标签 windows delphi winapi windows-7 windows-7-x64

我正在使用此代码在所有窗口顶部用鼠标画一条线。我正在使用鼠标钩子(Hook)获取鼠标坐标,并且在按下鼠标右键时每次鼠标移动时我都在画线。我正在使用 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 上运行速度非常慢。

我在 Delphi 3 中仅使用 Windows API 编写了一个鼠标手势程序(1999 年编写)(由于版本 3 中的 Delphi BUG,鼠标钩子(Hook)是用 VC 编写的)。这个程序正在做的正是StrokeIt正在做,但不知何故 StrokeIt 设法找到了解决这个问题的方法。

我的代码在 Delphi 中,但我们将不胜感激任何语言的答案!

我将更详细地解释我要构建的内容。我的申请分为三个部分:

  1. 单击鼠标右键时跟踪和存储鼠标手势
  2. 基于有限形状的手势识别
  3. 基于识别的手势和启动手势时光标下的应用程序激活宏

我无法让第 1 部分在 Windows7 (Vista) 上运行,正如 Martyn 在他的回答中所写,我想我必须改变概念。现在我通过 Hook 鼠标消息和我上面附加的代码绘制的手势来进行跟踪......我了解分层窗口的基础知识但是什么对我有用?你认为制作一个全屏最顶层的透明窗口并在上面绘图会完成这项工作吗?有人可以帮助我为此编写代码吗?

最佳答案

在 Windows Vista 之前,桌面被绘制为实际的 GDI 表面,因此这种事件有效 - 尽管它的工作速度取决于 GDI 驱动程序的加速。

在 Vista 及更高版本中,桌面窗口管理器使用 DX 将多个窗口(其中一些可能使用 GDI,而另一些可能不使用)组合在一起,形成一个最终场景,该场景呈现给更新的驱动程序模型。因此,直接戳屏幕像素会慢很多。

更根本的是,这不是完成任务的方法。我不太清楚您要构建什么,但您可能想了解分层 Windows:http://msdn.microsoft.com/en-us/library/ms997507.aspx它提供了一种受支持且适当的方式来在实际应用程序之上创建更复杂的场景。它们还应该帮助您避免使用鼠标 Hook ,这也是一个坏主意。

马丁

关于windows - 在 Win 7 上在桌面上画线非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108435/

相关文章:

c - 跟踪工具提示导致重绘速度极其缓慢的灰色 "trail"

c++ - 渲染到桌面

windows - echo 命令不适用于 Windows 10 中的 PowerShell

django - Delphi IdHTTP 在 Django 创建的表单上发布

delphi - 如何动态创建与顶部对齐但在其他对齐控件之后的控件?

CreateProcessWithLogonW 和AssignProcessToJobObject

python - Windows环境下如何使用python扫描BLE设备与通信

windows - Cygwin当前的完整安装大小是多少?

delphi - 重新声明隐藏基类中的成员

c - 如何通过在C中传递 "Console Windows"来将像素设置为 "String Pointer"?