首页 家电百科 实时讯息 常识
您的位置: 首页 > 常识 >

鼠标精灵详细使用方法(实现一个简单好玩的鼠标按键精灵)


整个程序比较简单,实现方式如下:

1、首先创建对话框和对话框上的控件,然后就是注册热键,因为一旦鼠标自动点击开始,就只能通过键盘组合键来让整个过程停止。特别要注意的是,注册的热键尽量不要和其它程序注册的一样,否则会冲突,冲突后可能会失效,因此注册的越特殊越好。

这里注册了2组热键,CTRL+SHIFT+F4用来锁定或释放鼠标的位置,CTRL+SHIFT+F6用来停止鼠标自动点击的过程。注册的热键要在程序退出时主动调用UnregisterHotKey删除掉。

RegisterHotKey(hWndDlg, WM_MOUSE_POS, MOD_CONTROL | MOD_SHIFT, VK_F4);

RegisterHotKey(hWndDlg, WM_MOUSE_STOP, MOD_CONTROL | MOD_SHIFT, VK_F6);

2、这里使用CreateDialogParam创建非模式对话框,制定自己的消息循环,非模式对话框可以正常接收键盘、鼠标消息。

3、消息及逻辑处理

  1. 程序启动过后,首先创建定时器,用来实时获取鼠标的位置。
  2. 处理热键


热键的消息处理逻辑

3、启动按钮处理,启动定时器开始模拟鼠标点击,开始和结束时间的逻辑比较简单暂时没有实现。

通过mouse_event实现模拟鼠标点击,但杀软、防火墙、部分游戏则可能屏蔽mouse_event。这些程序一般会挂接钩子或采用驱动,识别消息到底是不是由外部真正的键盘和鼠标产生的,如果不是会丢弃掉,主要是为了防止记录键盘和鼠标的木马程序。

完整的程序代码如下:

#define WM_MOUSE_POS WM_USER + 100

#define WM_MOUSE_STOP WM_USER + 100

#define ID_TIMER_MOUSE 1

#define ID_TIMER_CLICK 2

BOOL CALLBACK WndDlg(HWND,UINT,WPARAM,LPARAM);

BOOL CALLBACK AboutDlg(HWND,UINT,WPARAM,LPARAM);

HINSTANCE hInst;

POINT g_mousePos = { 0, 0 };

bool g_lockMouse = false;

SYSTEMTIME g_startSt = { 0 }, g_endSt = { 0 };

int g_clickType = 0; //0表示单击,1表示双击

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nShowCmd)

{

HWND hWndDlg = CreateDialogParam(hInst, "IDD_DIALOG1", NULL, (DLGPROC)WndDlg, NULL);

HWND hWndComboBox = GetDlgItem(hWndDlg, IDC_COMBO_SELECT_TYPE);

SendMessage(hWndComboBox, CB_ADDSTRING, 0, (LPARAM)TEXT("单击左键"));

SendMessage(hWndComboBox, CB_ADDSTRING, 0, (LPARAM)TEXT("双击左键"));

SendMessage(hWndComboBox, CB_SETCURSEL, 0, 0);

SYSTEMTIME st = { 2020,1,0,1,1,0,0,0 }; //默认设置持续1小时,当心此处的时间的有效性

SendMessage(GetDlgItem(hWndDlg, IDC_DTP_CONTINUE), DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM)&st);

SetWindowText(GetDlgItem(hWndDlg, IDC_INTERVAL), "1000");

SetWindowText(hWndDlg, "鼠标模拟");

ShowWindow(hWndDlg, SW_SHOW);

//注册的热键尽量不要和其它程序注册的一样,否则会冲突,冲突后会失效,杀软等也会屏蔽热键和mouse_event

RegisterHotKey(hWndDlg, WM_MOUSE_POS, MOD_CONTROL | MOD_SHIFT, VK_F4);

RegisterHotKey(hWndDlg, WM_MOUSE_STOP, MOD_CONTROL | MOD_SHIFT, VK_F6);

MSG msg;

while (GetMessage(&msg, NULL, NULL, NULL)) {

//if (msg.message == WM_KEYDOWN) {

// if (msg.wParam == VK_F3) g_lockMouse = !g_lockMouse;

//}

if (!IsDialogMessage(hWndDlg, &msg)) {// 如果消息没有被处理, 返回值为0

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

UnregisterHotKey(hWndDlg, WM_MOUSE_POS);

UnregisterHotKey(hWndDlg, WM_MOUSE_STOP);

return 0;

}

void CALLBACK UpdateMousePosTimeProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)

{

if (g_lockMouse) return;

GetCursorPos(&g_mousePos);

TCHAR str[64] = { 0 };

wsprintf(str, "%d , %d", g_mousePos);

SetWindowText(GetDlgItem(hwnd, IDC_MOUSE_POS), str);

}

void SetStartBtnState(HWND hwnd, BOOL state)

{

EnableWindow(GetDlgItem(hwnd, IDC_BTN_STOP), !state);

EnableWindow(GetDlgItem(hwnd, IDC_BTN_START), state);

}

//此处未处理开始和结束时间

void CALLBACK MouseClickTimeProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)

{

SetCursorPos(g_mousePos.x, g_mousePos.y);

Sleep(200);

for (int i = 0; i <= g_clickType; i++) {

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, g_mousePos.x, g_mousePos.y, 0, 0);

}

}

void StartMouseClickTimer(HWND hwnd)

{

TCHAR str[1024] = { 0 };

GetWindowText(GetDlgItem(hwnd, IDC_INTERVAL), str, 1000);

int inteval = atoi(str);

if (inteval < 100) {

MessageBox(hwnd, "间隔时间要大于等于100", "错误", MB_YESNO);

return;

}

g_clickType = SendMessage(GetDlgItem(hwnd, IDC_COMBO_SELECT_TYPE), CB_GETCURSEL, 0, 0);

SetTimer(hwnd, ID_TIMER_CLICK, inteval, MouseClickTimeProc);

}

BOOL CALLBACK WndDlg(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message) {

case WM_INITDIALOG:

SetTimer(hwnd, ID_TIMER_MOUSE, 100, UpdateMousePosTimeProc);

SetStartBtnState(hwnd, TRUE);

return TRUE;

case WM_HOTKEY:

if (HIWORD(lParam) == VK_F4 && LOWORD(lParam) == (MOD_CONTROL | MOD_SHIFT)) {

g_lockMouse = !g_lockMouse;

}

if (HIWORD(lParam) == VK_F6 && LOWORD(lParam) == (MOD_CONTROL | MOD_SHIFT)) {

SetStartBtnState(hwnd, TRUE);

KillTimer(hwnd, ID_TIMER_CLICK);

}

return TRUE;

case WM_COMMAND:

switch (LOWORD(wParam)) {

case IDC_BTN_START:

SetStartBtnState(hwnd, FALSE);

StartMouseClickTimer(hwnd);

break;

case IDC_BTN_STOP:

SetStartBtnState(hwnd, TRUE);

KillTimer(hwnd, ID_TIMER_CLICK);

break;

}

return TRUE;

case WM_CLOSE:

KillTimer(hwnd, ID_TIMER_MOUSE);

KillTimer(hwnd, ID_TIMER_CLICK);

DestroyWindow(hwnd);

return TRUE;

case WM_DESTROY:

PostQuitMessage(0);

return TRUE;

default:

return FALSE;

}

return FALSE;

}

萨维奥壁挂炉售后服务(全国统一预约中心)24小时服务热线

2025-07-07 06:00:49
萨维奥壁挂炉全国24小时统一售后服务客服热线电话:400-883-2086我们专注于家电维修领域,尤其在萨维奥壁挂炉维护与修理方面拥有深厚的专业知识和丰富经验。我们的目标是确保您的生活设备始终处于最佳状态,让您无后顾之忧。作为一支技术精湛的家电维修团队,我们集结了一批经验丰富、技术娴

艾喜仕太阳能热水器售后服务热线(各区/24小时)统一客服热线

2025-07-07 06:00:35
艾喜仕太阳能热水器全国服务热线:400-883-2086随时为您解决家电维修问题无论我们多么小心使用家电产品,总会有一天出现故障的时候。面对这种情况,许多人可能会感到困惑和无助,不知道该去哪里寻求帮助。作为家电维修问题的专家,我们建议您拨打艾喜仕太阳能热水器全国服务热线:(以产品说明书或保修卡电

万和燃气热水器全国售后服务网点号码实时反馈-今-日-汇-总

2025-07-07 06:00:27
万和燃气热水器产品使用介绍:便捷安全,操作无忧万和燃气热水器作为领域的佼佼者,凭借精湛工艺与前沿科技,为用户珍贵财物保驾护航。当您选择万和燃气热水器,全国售后服务点热线号码 400-883-2086 随时待命,无论使用中遇到任何疑问,都能获得专业解答。下面为您详细介绍万和燃气热水器的使用方法及相

美国总统特朗普签署得克萨斯州克尔县重大灾难声明

2025-07-07 00:23:00
当地时间7月6日,美国总统特朗普在社交媒体平台“真实社交”上发布消息,宣布已签署得克萨斯州克尔县的重大灾难声明,此举旨在确保急救人员能立即获得所需资源。同时,特朗普政府称会继续与州、地方领导人保持密切合作。△美国总统特朗普(资料图)美国得克萨斯州近日遭遇暴雨,引发严重洪灾,部分地区许多房屋、车辆和道

中外专家共商跨国犯罪治理 科技利剑斩断生态黑色链条

2025-07-06 22:27:00
来源:【贵州广播电视台-动静新闻】在7月6日举办的“刑事打击与生态安全保护”主题论坛上,来自国际刑警组织、澜湄执法合作中心及格鲁吉亚、东帝汶等国代表,与来自法医鉴定、环境工程领域的院士专家等,共议跨国生态犯罪治理,用技术创新与协作智慧为全球生态安全筑牢防线。 论坛上,8名中外嘉宾围绕“打击治理跨国跨