在Win 7上桌面画线非常缓慢

5
我将使用以下代码在所有窗口上方使用鼠标绘制一条线。我使用鼠标钩子获取鼠标坐标,并在每次右键按下时绘制该线。我使用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编写了一个鼠标手势程序(1999年编写),仅使用Windows API(由于Delphi 3版本中的错误,鼠标钩子是用VC编写的)。该程序正好做到了StrokeIt所做的事情,但不知何故,StrokeIt设法找到了解决此问题的方法。
我的代码是用Delphi编写的,但任何语言的答案都会受到赞赏!
我将详细说明我要构建的内容。我的应用程序分为三个部分:
1. 在点击右键时跟踪和存储鼠标手势 2. 基于有限数量的形状进行手势识别 3. 基于识别出的手势和启动手势时光标下的应用程序来激活宏
我在Windows7(Vista)上无法使Part1工作,正如Martyn在他的答案中所写,我想我必须改变概念。现在,我通过挂钩鼠标消息进行跟踪,并通过我上面附加的代码进行手势绘制...我理解分层窗口的基础知识,但什么对我有效?您认为制作一个全屏顶部透明窗口并在其上绘制是否能胜任此工作?有人能帮我编写这个代码吗?
1个回答

10
在 Windows Vista 之前,桌面是以实际的 GDI 表面绘制的,因此这种活动是有效的,尽管它的速度取决于您的 GDI 驱动程序加速情况。Vista 及更高版本的桌面窗口管理器使用 DX 将多个窗口(其中一些可能使用 GDI,而另一些则可能不使用)合成为一个最终场景,该场景呈现给新的驱动程序模型。直接操作屏幕像素会变得非常慢。
更根本的是,这不是完成任务的方法。我不太清楚您想要构建什么,但您可能希望了解关于分层窗口的内容:http://msdn.microsoft.com/en-us/library/ms997507.aspx 它们提供了一种支持和适当的方法来创建更复杂的场景,覆盖实际应用程序的顶部。它们还可以帮助您避免使用鼠标钩子,这也是一个不好的想法。
Martyn

我在我的问题中添加了一些解释,你能否审核一下? - Shlantz
看起来下一步是下载一些分层窗口示例代码并了解它们的实际工作原理。很抱歉我没有时间为你编写代码。 - Martyn Lovell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接