鼠标移动痕迹 C#,Delphi,VB,VB.net四种语言版本(附窗体透明)-思路和源代码(1)

来源:互联网 发布:对于网络直播你怎么看 编辑:程序博客网 时间:2024/05/29 11:08

QQ交流:740382997

或者发邮件给我:yichensoft@126.com

翼尘软件工作室

翼尘Q群号:252367359


鼠标移动痕迹,四种语言版本的实现。

VB版下载地址:http://download.csdn.net/detail/u011351840/5753079

VB.net版下载地址:http://download.csdn.net/detail/u011351840/5753069

C#版下载地址:http://download.csdn.net/detail/u011351840/5753061

Delphi版下载地址:http://download.csdn.net/detail/u011351840/5753063

先看效果:Delphi版本的


其他语言效果:


先说下思路吧,既然是鼠标痕迹,那么一定要从MouseMove之类的事件开始,记录下每次鼠标移动之后的位置。

之后在每次移动的位置上画一个圈(或者其他图形),这里可以用Timer计时,比如1秒之后这个圈消失,然后就能形成一种鼠标移过之后出现尾巴的效果。


接下来说一下具体如何实现吧,从比较简单的VB开始

画控件的时候除了一个窗体和一个Timer之外什么都不需要了。

代码中我们需要三个数组和两个变量,这三个数组的大小可以任意,但是必须大小相同,这个数字代表了能够在屏幕上出现的最多圆圈(或者其他图形)的数量。

Dim xv(1024) As DoubleDim yv(1024) As DoubleDim si(1024) As DoubleDim size As IntegerDim ce As Integer
在Load中初始化,-1表示空记录,而size代表的刚才数组的长度,si数组记录的是圈的初始,这里我设置成了2
Private Sub Form_Load()size = 1024For i = 0 To sizexv(i) = -1yv(i) = -1si(i) = 2Next iEnd Sub
接下来是刚才提到的MouseMove事件,ce记录的是记录的数量,每次Move都往xv和yv中记录此次的x和y值,然后ce自加,也就是所记录的储存数量增加,如果ce大于size,那么ce清零,这也就是为什么数组的大小先定了能够在屏幕上出现的圆圈数量。

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single)xv(ce) = xyv(ce) = Yce = ce + 1If (ce >= size) Thence = 0End IfEnd Sub
为了让效果更好,我们可以在Timer中添加时间,使圆圈从小到大,达到限定值时消失(读者可以自己改进为渐变消失)

Form1.ClsFor i = 0 To sizeIf (xv(i) <> -1) ThenForm1.Circle (xv(i), yv(i)), si(i), RGB(Rnd() * 255, Rnd() * 255, Rnd() * 255)si(i) = si(i) + 20If (si(i) > 300) Thenxv(i) = -1yv(i) = -1si(i) = 2End IfEnd IfNext i
这是在窗体中实现鼠标的痕迹,那么如果把鼠标痕迹融入到平时使用电脑的过程中呢,这时候我们需要让窗体透明。

通过查询API函数我们可以查出以下函数能使窗体透明。

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As LongPrivate Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As LongPrivate Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As LongPrivate Const HWND_TOPMOST = -1Private Const WS_EX_LAYERED = &H80000Private Const GWL_EXSTYLE = (-20)Private Const LWA_ALPHA = &H2Private Const LWA_COLORKEY = &H1
FormLoad中添加

SetWindowPos Form1.hwnd, -1, 0, 0, 0, 0, FlagMe.BackColor = &HFF0000Dim rtn As LongDim BorderStylerBorderStyler = 0rtn = GetWindowLong(hwnd, GWL_EXSTYLE)rtn = rtn Or WS_EX_LAYEREDSetWindowLong hwnd, GWL_EXSTYLE, rtnSetLayeredWindowAttributes hwnd, &HFF0000, 0, LWA_COLORKEY
这时候窗体就能透明了,不过同时MouseMove事件也不能触发了,那么我们又需要用到一个获取鼠标位置的API函数
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Type POINTAPIx As Longy As LongEnd TypeDim position As POINTAPI
这样在Timer中不停监视鼠标位置就可以了

xv(ce) = position.xyv(ce) = position.y
以上就是通过VB实现的
下一篇,Delphi版本

鼠标移动痕迹 C#,Delphi,VB,VB.net四种语言版本(附窗体透明)-思路和源代码(2)

原创粉丝点击