+
+创建的分支需要以`feature/`开头,以表示功能分支,或创建一个fork,并在fork的分支开发。
+
+发布pr时不限定合并分支,只要不是`main`分支都可以。
+
+## 🔠版本号
+clickmouse版本格式为:`A.B.C.D[(alpha | beta |.dev | rc) E]`
+## 😊正式版本
+正式版不带.dev、alpha、beta或rc后缀。
+
+A位代表有重大更新,有代码级的变动。如1.0升级到2.0就重构了代码。
+
+B位代表有普通更新,通常是更新一些大功能。
+
+C位代表有修复更新,通常会更新一些小功能和一些bug。
+
+D位代表版本代号,通常每A, B, C位有变动时候+1。也有可能A, B, C位没有变动,D位+1,这代表紧急更新,通常是修复几个重大影响的bug。
+
+## 🅱️测试版本
+测试版本带.dev、alpha、beta或rc后缀。
+
+通常前面的`A.B.C.D`在一个测试周期内不变,代表下一个版本。
+
+`.dev`代表早期开发更新,功能不稳定,bug很多,位于版本项目初期。这阶段新增的功能将会被放到实验室中,并默认关闭。
+
+`alpha`代表晚期开发更新,功能不完善,bug较多,位于版本项目早期。这阶段新增的功能将会被放到实验室中,并默认关闭。
+
+`beta`代表发布测试更新,功能完善,bug较少,不会再新增功能,位于版本项目中期,并且会逐步合并实验室中的feature。
+
+`rc`代表预备发布版本,功能完善,bug较少,会修复一些重要安全问题或bug,最接近正式版,即将发布正式版,位于版本项目末期。
+
+## ❓issue
+- 标题格式:`[类型] 标题`
+- 内容应准确写出你的需求,并选择性给出解决方案,上传截图,添加附加信息(如clickmouse版本号)
+- 类型为`bug`、`enhancement`、`question`等。
+- 我们给了一些模板,可直接使用。
+- 使用`labels`来标记issue的类型,比如`bug`、`enhancement`、`question`等。
+- 设置issue的`milestone`为你想应用的issue版本。
+- 安全问题请见[安全说明文档](./SECURITY.md)。
+
+## ❇️pr
+- 标题格式:`[类型] 标题`
+- 使用`labels`来标记pr的类型,比如`bug`、`enhancement`、`question`等。
+- 关联issue,这样我们就可以知道这个pr解决了哪个issue。
+- 需要准确写出更新内容,关联到版本号的milestone。
+- 可选添加实现思路
+
+### 🎫规范
+我们pr合并的顺序为:
+```mermaid
+graph LR
+A(其他用户的功能开发分支) --> B(develop/rp分支)
+B --> C(main分支)
+```
+
+pr无特定格式,但是必须清晰描述更新内容,关联到版本号的milestone;标题要简略描述更新内容,若修复或添加了issue里的建议,把该issue编号写进该行为,若出现多个重复issue,则只用写一个,并简单描述此bug。
+
+### ✈️快车pr
+> [!WARNING]
+> 快车pr请谨慎使用
+- 快车pr的意思是跳过部分正常的pr合并分支步骤,以更快的合并到目标分支的功能。
+- 标题格式:`[✈️快车] 标题`
+- 使用快车必须在pr描述中说明使用的原因
+
+如果有人快车合并,但没写快车合并的原因,则拒绝合并该人的分支。
+
+快车pr有高优先级,会优先进行处理。
+
+## 📊milestone
+- 我们给每个版本都设置了一个milestone,用来管理该版本的issue和pr。
+- 需要每个issue或pr都关联到一个milestone,这样我们才能知道该issue或pr是否在下个版本中添加。
+- milestone格式为:`dev_版本号`
+
+## ⬇️配置仓库
+1. 下载仓库:`git clone https://github.com/xystudiocode/pyClickMouse.git`
+2. 对于python版本安装python,推荐使用3.13,和软件开发者的版本一一致,[下载连接](https://www.python.org/downloads/release/python-31312/)
+3. 对于头文件和dll版本,可以安装[visual studio](https://visualstudio.microsoft.com/)。
+### 🖥️GUI
+1. 下载源码
+2. 放置一个`7z.exe`和`7z.dll`到`gui`目录
+3. 安装chocolately
+```powershell
+Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
+```
+4. 安装make工具
+```powershell
+choco install make
+```
+5. 配置python包
+```powershell
+pip install -r requirements.txt
+```
+6. 编译
+```powershell
+make clickmouse # 编译clickmouse
+make extension # 编译扩展
+make clickclean # 如果你要编译精简版,请用这个。
+```
+7. 运行`dist/clickmouse/clickmouse/main.exe`就可以加载clickmouse了。
+### 🥴头文件
+仅需修改头文件,就可以被调用
+### ⚙️dll调用
+使用visual studio修改`./dll/dll.sln`里的`源文件/dllmain.cpp`
+### 💾gui旧版本
+> [!NOTE]
+> gui旧版本的再编译不接受pull request
+使用visual studio修改`./ClickMouse-old/ClickMouse.sln`里的`源文件/clickmouse.cpp`
+### 🐍python库调用
+修改`clickmouse/`下的代码,运行`pip install .`安装
+### 🦎pyd调用
+修改`cython/main.py`的代码,然后执行
+```python cython/setup.py build_ext --inplace```
+编译结束后,该目录下应该会有个以`.pyd`结尾的文件。
\ No newline at end of file
diff --git a/ClickMouse-old/ClickMouse.sln b/ClickMouse-old/ClickMouse.sln
new file mode 100644
index 0000000..b47f6b9
--- /dev/null
+++ b/ClickMouse-old/ClickMouse.sln
@@ -0,0 +1,51 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.14.36327.8
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ClickMouse", "ClickMouse\ClickMouse.vcxproj", "{C6B296F0-8D36-4312-9E7D-DD7AE1381AF1}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "外部文件", "外部文件", "{9FA3D6BD-1EC1-3BA5-80CB-CE02773A58D5}"
+ ProjectSection(SolutionItems) = preProject
+ .gitattributes = .gitattributes
+ .gitignore = .gitignore
+ LICENSE = LICENSE
+ README.md = README.md
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Readme_images", "Readme_images", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
+ ProjectSection(SolutionItems) = preProject
+ readme_images\AddConstruct.png = readme_images\AddConstruct.png
+ readme_images\Build.png = readme_images\Build.png
+ readme_images\Install.png = readme_images\Install.png
+ readme_images\SelectFile.png = readme_images\SelectFile.png
+ readme_images\SetIDEPath.png = readme_images\SetIDEPath.png
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C6B296F0-8D36-4312-9E7D-DD7AE1381AF1}.Debug|x64.ActiveCfg = Debug|x64
+ {C6B296F0-8D36-4312-9E7D-DD7AE1381AF1}.Debug|x64.Build.0 = Debug|x64
+ {C6B296F0-8D36-4312-9E7D-DD7AE1381AF1}.Debug|x86.ActiveCfg = Debug|Win32
+ {C6B296F0-8D36-4312-9E7D-DD7AE1381AF1}.Debug|x86.Build.0 = Debug|Win32
+ {C6B296F0-8D36-4312-9E7D-DD7AE1381AF1}.Release|x64.ActiveCfg = Release|x64
+ {C6B296F0-8D36-4312-9E7D-DD7AE1381AF1}.Release|x64.Build.0 = Release|x64
+ {C6B296F0-8D36-4312-9E7D-DD7AE1381AF1}.Release|x86.ActiveCfg = Release|Win32
+ {C6B296F0-8D36-4312-9E7D-DD7AE1381AF1}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {9FA3D6BD-1EC1-3BA5-80CB-CE02773A58D5}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {29F03280-25F1-4764-928B-0E5C4E19DA3B}
+ EndGlobalSection
+EndGlobal
diff --git a/ClickMouse-old/ClickMouse/ClickMouse.cpp b/ClickMouse-old/ClickMouse/ClickMouse.cpp
new file mode 100644
index 0000000..4703710
--- /dev/null
+++ b/ClickMouse-old/ClickMouse/ClickMouse.cpp
@@ -0,0 +1,456 @@
+// ClickMouse.cpp : 定义应用程序的入口点。
+//
+
+#include "framework.h"
+#include "ClickMouse.h"
+#include "shellapi.h"
+#include "windows.h"
+
+#define MAX_LOADSTRING 100
+
+// 全局变量:
+HINSTANCE hInst; // 当前实例
+WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
+WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
+UINT_PTR g_TimerId = 0; // 定时器ID
+bool g_IsPaused = false; // 暂停状态
+int g_CurrentClick = 0; // 当前点击类型 0:无 1:左键 2:右键
+int g_Interval = 0; // 点击间隔
+WCHAR g_szInterval[100] = { 0 }; // 保存合法的间隔值文本
+HWND g_hTargetWnd = NULL;
+bool g_UseForceFocus = true; // 是否启用强制焦点
+
+// 此代码模块中包含的函数的前向声明:
+ATOM MyRegisterClass(HINSTANCE hInstance);
+BOOL InitInstance(HINSTANCE, int);
+LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
+INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
+INT_PTR CALLBACK UpdateLog(HWND, UINT, WPARAM, LPARAM);
+
+bool IsRunAsAdmin() {
+ SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
+ PSID AdministratorsGroup;
+ BOOL isAdmin = FALSE;
+
+ if (AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
+ DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup)) {
+ CheckTokenMembership(NULL, AdministratorsGroup, &isAdmin);
+ FreeSid(AdministratorsGroup);
+ }
+ return isAdmin;
+}
+
+// 窗口焦点处理函数
+bool EnsureTargetFocus(HWND hDlg) {
+ // 获取当前前景窗口
+ HWND hForeground = GetForegroundWindow();
+
+ // 如果已经是目标窗口且未启用强制聚焦
+ if (hForeground == g_hTargetWnd && !g_UseForceFocus)
+ return true;
+
+ // 使用更精确的窗口匹配算法
+ DWORD dwForegroundPID;
+ GetWindowThreadProcessId(hForeground, &dwForegroundPID);
+
+ // 检查窗口有效性
+ if (!IsWindowVisible(hForeground) || IsIconic(hForeground)) {
+ MessageBox(hDlg, L"目标窗口不可用\n错误描述:目标窗口不可见或最小化。", L"错误", MB_ICONERROR);
+ return false;
+ }
+
+ // 使用AttachThreadInput实现精确输入控制
+ DWORD dwCurrentThread = GetCurrentThreadId();
+ DWORD dwTargetThread = GetWindowThreadProcessId(hForeground, NULL);
+
+ if (dwCurrentThread != dwTargetThread) {
+ AttachThreadInput(dwCurrentThread, dwTargetThread, TRUE);
+ }
+
+ // 使用渐进式聚焦策略
+ SetWindowPos(hForeground, HWND_TOPMOST, 0, 0, 0, 0,
+ SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
+ SetWindowPos(hForeground, HWND_NOTOPMOST, 0, 0, 0, 0,
+ SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
+
+ // 发送扩展聚焦消息(绕过某些应用程序的限制)
+ SendMessageTimeout(hForeground, WM_MOUSEACTIVATE, 0, 0,
+ SMTO_NORMAL, 100, NULL);
+
+ // 使用低级别键盘事件触发聚焦
+ INPUT input[4] = { 0 };
+ input[0].type = INPUT_KEYBOARD;
+ input[0].ki.wVk = VK_MENU;
+ input[1].type = INPUT_KEYBOARD;
+ input[1].ki.wVk = VK_TAB;
+ input[2].type = INPUT_KEYBOARD;
+ input[2].ki.wVk = VK_TAB;
+ input[2].ki.dwFlags = KEYEVENTF_KEYUP;
+ input[3].type = INPUT_KEYBOARD;
+ input[3].ki.wVk = VK_MENU;
+ input[3].ki.dwFlags = KEYEVENTF_KEYUP;
+ SendInput(4, input, sizeof(INPUT));
+
+ // 解除线程绑定
+ if (dwCurrentThread != dwTargetThread) {
+ AttachThreadInput(dwCurrentThread, dwTargetThread, FALSE);
+ }
+
+ return (GetForegroundWindow() == hForeground);
+}
+
+// 定时器处理函数
+VOID CALLBACK EnhancedTimerProc(HWND hwnd, UINT msg, UINT_PTR id, DWORD time) {
+ static bool bFocusEnsured = false;
+
+ // 首次尝试聚焦
+ if (!bFocusEnsured) {
+ if (!EnsureTargetFocus(GetParent(hwnd))) {
+ KillTimer(hwnd, id);
+ MessageBox(GetParent(hwnd), L"无法获取窗口焦点\n错误描述:你的程序不支持此工具。", L"错误", MB_ICONERROR);
+ return;
+ }
+ bFocusEnsured = true;
+ }
+
+ // 获取窗口实际位置(考虑DPI缩放)
+ RECT rcWindow;
+ if (!GetWindowRect(g_hTargetWnd, &rcWindow)) {
+ KillTimer(hwnd, id);
+ MessageBox(GetParent(hwnd), L"无法获取窗口尺寸\n错误描述:你的程序不支持此工具。", L"错误", MB_ICONERROR);
+ return;
+ }
+
+ // 生成智能点击坐标(避开边缘区域)
+ int x = rcWindow.left + (rcWindow.right - rcWindow.left) * 0.5;
+ int y = rcWindow.top + (rcWindow.bottom - rcWindow.top) * 0.5;
+
+ // 使用混合输入法发送事件
+ INPUT inputs[4] = { 0 };
+
+ // 鼠标按下
+ inputs[0].type = INPUT_MOUSE;
+ inputs[0].mi.dx = x * (65535 / GetSystemMetrics(SM_CXSCREEN));
+ inputs[0].mi.dy = y * (65535 / GetSystemMetrics(SM_CYSCREEN));
+ inputs[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
+
+ inputs[1].type = INPUT_MOUSE;
+ inputs[1].mi.dwFlags = (g_CurrentClick == 1) ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_RIGHTDOWN;
+
+ // 鼠标释放
+ inputs[2].type = INPUT_MOUSE;
+ inputs[2].mi.dwFlags = (g_CurrentClick == 1) ? MOUSEEVENTF_LEFTUP : MOUSEEVENTF_RIGHTUP;
+
+ // 添加随机移动防止检测
+ inputs[3].type = INPUT_MOUSE;
+ inputs[3].mi.dx = (x + rand() % 5 - 2) * (65535 / GetSystemMetrics(SM_CXSCREEN));
+ inputs[3].mi.dy = (y + rand() % 5 - 2) * (65535 / GetSystemMetrics(SM_CYSCREEN));
+ inputs[3].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
+
+ SendInput(4, inputs, sizeof(INPUT));
+}
+
+void LeftClick() {
+ // 创建一个INPUT结构体用于发送鼠标事件
+ INPUT input;
+ input.type = INPUT_MOUSE;
+ input.mi.dx = 0;
+ input.mi.dy = 0;
+ input.mi.mouseData = 0;
+ input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; // 鼠标左键按下
+ input.mi.time = 0;
+ input.mi.dwExtraInfo = 0;
+ SendInput(1, &input, sizeof(INPUT));
+
+ // 模拟鼠标左键释放
+ input.mi.dwFlags = MOUSEEVENTF_LEFTUP; // 鼠标左键释放
+ SendInput(1, &input, sizeof(INPUT));
+}
+
+void RightClick() {
+ // 创建一个INPUT结构体用于发送鼠标事件
+ INPUT input;
+ input.type = INPUT_MOUSE;
+ input.mi.dx = 0;
+ input.mi.dy = 0;
+ input.mi.mouseData = 0;
+ input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN; // 鼠标右键按下
+ input.mi.time = 0;
+ input.mi.dwExtraInfo = 0;
+ SendInput(1, &input, sizeof(INPUT));
+
+ // 模拟鼠标右键释放
+ input.mi.dwFlags = MOUSEEVENTF_RIGHTUP; // 鼠标右键释放
+ SendInput(1, &input, sizeof(INPUT));
+}
+
+// 对话框消息处理函数
+INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_COMMAND:
+ {
+ int wmId = LOWORD(wParam);
+ switch (wmId)
+ {
+ case IDM_ABOUT:
+ DialogBox(GetModuleHandle(NULL),
+ MAKEINTRESOURCE(IDD_ABOUTBOX),
+ hDlg, About);
+ break;
+ case IDM_UPDATE:
+ ShellExecuteW(NULL, L"open", L"https://github.com/xystudio889/ClickMouse/releases/latest", NULL, NULL, SW_SHOWNORMAL);
+ break;
+ case IDM_UPDATE_LOG:
+ DialogBox(GetModuleHandle(NULL),
+ MAKEINTRESOURCE(IDD_UPDATE_LOG),
+ hDlg, UpdateLog);
+ break;
+ case IDM_EXIT:
+ SendMessage(hDlg, WM_CLOSE, 0, 0);
+ break;
+ case IDC_LEFT: // 左键连点按钮
+ case IDC_RIGHT: // 右键连点按钮
+ {
+ // 停止现有定时器
+ if (g_TimerId) {
+ KillTimer(hDlg, g_TimerId);
+ g_TimerId = 0;
+ }
+
+ // 获取并验证间隔时间
+ WCHAR szInterval[100];
+ GetDlgItemText(hDlg, IDC_DELAY_INPUT_BOX, szInterval, 100);
+
+ // 检查是否为纯数字
+ bool valid = true;
+ for (int i = 0; szInterval[i]; i++) {
+ if (!iswdigit(szInterval[i])) {
+ valid = false;
+ break;
+ }
+ }
+
+ if (!valid || wcslen(szInterval) == 0) {
+ MessageBox(hDlg, L"请输入有效的数字间隔", L"错误", MB_ICONERROR);
+ return TRUE;
+ }
+
+ // 保存合法值
+ wcscpy_s(g_szInterval, szInterval);
+ g_Interval = _wtoi(szInterval);
+
+ // 设置新的点击类型
+ g_CurrentClick = (wmId == IDC_LEFT) ? 1 : 2;
+
+ // 启动定时器
+ g_TimerId = SetTimer(hDlg, 1, g_Interval, EnhancedTimerProc); // 使用回调函数
+ SetDlgItemText(hDlg, IDC_PAUSE, L"暂停");
+ break;
+ }
+
+ case IDC_PAUSE: // 暂停/重启按钮
+ {
+ if (g_CurrentClick != 0) {
+ if (g_IsPaused) {
+ // 重启定时器
+ g_TimerId = SetTimer(hDlg, 1, g_Interval, NULL);
+ if (g_TimerId) {
+ SetDlgItemText(hDlg, IDC_PAUSE, L"暂停");
+ g_IsPaused = false;
+ }
+ }
+ else {
+ // 暂停定时器
+ if (KillTimer(hDlg, 1)) {
+ g_IsPaused = true;
+ SetDlgItemText(hDlg, IDC_PAUSE, L"重启");
+ }
+ }
+ }
+ break;
+ }
+
+ case IDC_STOP: // 停止按钮
+ {
+ if (g_CurrentClick) {
+ KillTimer(hDlg, 1);
+ g_TimerId = 0;
+ g_CurrentClick = 0;
+ g_IsPaused = false;
+ SetDlgItemText(hDlg, IDC_PAUSE, L"暂停");
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ case WM_TIMER:
+ {
+ if (wParam == 1) {
+ if (g_CurrentClick == 1) {
+ LeftClick();
+ }
+ else if (g_CurrentClick == 2) {
+ RightClick();
+ }
+ }
+ break;
+ }
+
+ case WM_PAINT:
+ {
+ PAINTSTRUCT ps;
+ BeginPaint(hDlg, &ps);
+ EndPaint(hDlg, &ps);
+ return TRUE;
+ }
+
+ case WM_CLOSE:
+ if (g_TimerId) {
+ KillTimer(hDlg, g_TimerId);
+ }
+ EndDialog(hDlg, 0);
+ return TRUE;
+
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+// 入口点
+int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
+ _In_opt_ HINSTANCE hPrevInstance,
+ _In_ LPWSTR lpCmdLine,
+ _In_ int nCmdShow)
+{
+ // 创建基于资源的主对话框
+ DialogBoxParamW(
+ hInstance,
+ MAKEINTRESOURCEW(IDD_MAIN_WINDOW),
+ NULL,
+ MainDlgProc, // 新的对话框过程函数
+ (LPARAM)0
+ );
+ return 0;
+}
+
+
+//
+// 函数: MyRegisterClass()
+//
+// 目标: 注册窗口类。
+//
+ATOM MyRegisterClass(HINSTANCE hInstance)
+{
+ WNDCLASSEXW wcex = { 0 };
+
+ wcex.cbSize = sizeof(WNDCLASSEX);
+
+ wcex.style = CS_HREDRAW | CS_VREDRAW;
+ wcex.lpfnWndProc = MainDlgProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = 0;
+ wcex.hInstance = hInstance;
+ wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
+ wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+ wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_CLICKMOUSE);
+ wcex.lpszClassName = szWindowClass;
+ wcex.cbSize = sizeof(WNDCLASSEX);
+ wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CLICKMOUSE));
+ wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CLICKMOUSE));
+
+ return RegisterClassExW(&wcex);
+}
+
+//
+// 函数: InitInstance(HINSTANCE, int)
+//
+// 目标: 保存实例句柄并创建主窗口
+//
+// 注释:
+//
+// 在此函数中,我们在全局变量中保存实例句柄并
+// 创建和显示主程序窗口。
+//
+BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
+{
+ hInst = hInstance; // 将实例句柄存储在全局变量中
+
+ HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
+
+ if (!hWnd)
+ {
+ return FALSE;
+ }
+
+ ShowWindow(hWnd, nCmdShow);
+ UpdateWindow(hWnd);
+
+ return TRUE;
+}
+
+// “关于”框的消息处理程序。
+INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ UNREFERENCED_PARAMETER(lParam);
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ // 启用DPI感知
+ SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
+ // 申请管理员权限
+ if (!IsRunAsAdmin()) {
+ ShellExecute(NULL, L"runas", GetCommandLine(), NULL, NULL, SW_SHOWNORMAL);
+ }
+ return (INT_PTR)TRUE;
+
+ case WM_COMMAND:
+ if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
+ {
+ EndDialog(hDlg, LOWORD(wParam));
+ return (INT_PTR)TRUE;
+ }
+ else if (LOWORD(wParam) == IDSTAR)
+ {
+ ShellExecuteW(NULL, L"open", L"https://github.com/xystudio889/ClickMouse/", NULL, NULL, SW_SHOWNORMAL);
+ }
+ break;
+ }
+ return (INT_PTR)FALSE;
+}
+
+// “更新日志”框的消息处理程序。
+INT_PTR CALLBACK UpdateLog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ UNREFERENCED_PARAMETER(lParam);
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ // 启用DPI感知
+ SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
+ // 申请管理员权限
+ if (!IsRunAsAdmin()) {
+ ShellExecute(NULL, L"runas", GetCommandLine(), NULL, NULL, SW_SHOWNORMAL);
+ }
+ return (INT_PTR)TRUE;
+
+ case WM_COMMAND:
+ if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
+ {
+ EndDialog(hDlg, LOWORD(wParam));
+ return (INT_PTR)TRUE;
+ }
+ else if (LOWORD(wParam) == IDSHOW_MORE_UPDATE_LOG)
+ {
+ ShellExecuteW(NULL, L"open", L"https://github.com/xystudio889/ClickMouse/releases", NULL, NULL, SW_SHOWNORMAL);
+ }
+ break;
+ }
+ return (INT_PTR)FALSE;
+}
diff --git a/ClickMouse-old/ClickMouse/ClickMouse.h b/ClickMouse-old/ClickMouse/ClickMouse.h
new file mode 100644
index 0000000..1639539
--- /dev/null
+++ b/ClickMouse-old/ClickMouse/ClickMouse.h
@@ -0,0 +1,3 @@
+#pragma once
+
+#include "resource.h"
diff --git a/ClickMouse-old/ClickMouse/ClickMouse.rc b/ClickMouse-old/ClickMouse/ClickMouse.rc
new file mode 100644
index 0000000..aea4b91
--- /dev/null
+++ b/ClickMouse-old/ClickMouse/ClickMouse.rc
@@ -0,0 +1,247 @@
+// Microsoft Visual C++ generated resource script.
+//
+#pragma code_page(65001)
+
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#ifndef APSTUDIO_INVOKED
+#include "targetver.h"
+#endif
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 中文(简体,中国) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDC_CLICKMOUSE MENU
+BEGIN
+ POPUP "帮助(&H)"
+ BEGIN
+ MENUITEM "关于(&A)", IDM_ABOUT
+ MENUITEM "更新(&U)", IDM_UPDATE
+ MENUITEM "更新日志(&L)", IDM_UPDATE_LOG
+ END
+ MENUITEM "退出(&X)", IDM_EXIT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDC_CLICKMOUSE ACCELERATORS
+BEGIN
+ "?", IDM_ABOUT, ASCII, ALT
+ "/", IDM_ABOUT, ASCII, ALT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ABOUTBOX DIALOGEX 0, 0, 157, 106
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "关于 Clickmouse"
+FONT 10, "Microsoft Sans Serif", 400, 0, 0x0
+BEGIN
+ ICON IDI_CLICKMOUSE,IDC_STATIC,14,14,20,20
+ DEFPUSHBUTTON "确定",IDOK,100,85,50,14,WS_GROUP
+ LTEXT "Clickmouse,版本1.0.2.3",IDC_STATIC,36,17,114,8
+ LTEXT "一款轻便、快捷,使用C++制作的鼠标连点器",IDC_STATIC,31,38,119,18
+ PUSHBUTTON "支持作者",IDSTAR,7,85,50,14
+ LTEXT "本软件完全开源,作者为xystudio。建议前往项目地址来个star!",IDC_STATIC,7,65,143,17
+END
+
+IDD_MAIN_WINDOW DIALOGEX 0, 0, 300, 150
+STYLE DS_SETFONT | DS_NOFAILCREATE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ClickMouse"
+MENU IDC_CLICKMOUSE
+FONT 9, "微软雅黑", 0, 0, 0x1
+BEGIN
+ PUSHBUTTON "右键连点",IDC_RIGHT,210,20,60,20
+ PUSHBUTTON "左键连点",IDC_LEFT,30,20,60,20
+ PUSHBUTTON "暂停",IDC_PAUSE,120,50,60,20
+ PUSHBUTTON "停止",IDC_STOP,120,80,60,20
+ LTEXT "间隔(毫秒):",IDC_DELAY_TEXT,67,110,60,13
+ EDITTEXT IDC_DELAY_INPUT_BOX,120,110,140,15,ES_CENTER | ES_AUTOHSCROLL
+END
+
+IDD_UPDATE_LOG DIALOGEX 0, 0, 205, 193
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "更新日志"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "确定",IDOK,148,172,50,14
+ PUSHBUTTON "更多日志",IDSHOW_MORE_UPDATE_LOG,37,172,50,14
+ LTEXT "2025/08/03 v1.0.0.0",IDC_STATIC,7,7,80,8
+ LTEXT "ClickMouse上线",IDC_STATIC,7,18,191,8
+ LTEXT "2025/08/03 v1.0.1.0",IDC_STATIC,7,32,80,8
+ LTEXT "对'关于'界面更新:\n\t·添加了""支持作者""按钮\n\t移动'更新按钮'到主窗口的'帮助'菜单\n添加了找不到焦点提示",IDC_STATIC,7,43,191,40
+ LTEXT "2025/08/03 v1.0.2.0",IDC_STATIC,7,82,80,8
+ LTEXT "添加了“更新日志”界面",IDC_STATIC,7,94,191,8
+ LTEXT "目前最多显示5个更新日志,更多更新日志请查阅github releases.",IDC_STATIC,7,147,191,17
+ LTEXT "2025/08/03 v1.0.2.3",IDC_STATIC,7,109,80,8
+ LTEXT "修改了部分显示字符\n修复了当关闭""更新日志""时,主窗口一并关闭的问题",IDC_STATIC,7,121,191,19
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_ABOUTBOX, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 150
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 99
+ END
+
+ IDD_MAIN_WINDOW, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 138
+ END
+
+ IDD_UPDATE_LOG, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 198
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 186
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#ifndef APSTUDIO_INVOKED\r\n"
+ "#include ""targetver.h""\r\n"
+ "#endif\r\n"
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,2,3
+ PRODUCTVERSION 1,0,2,3
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "080404b0"
+ BEGIN
+ VALUE "CompanyName", "xystudio"
+ VALUE "FileDescription", "鼠标连点器"
+ VALUE "FileVersion", "1.0.2.3"
+ VALUE "InternalName", "Clickmouse.exe"
+ VALUE "LegalCopyright", "©xystudio"
+ VALUE "OriginalFilename", "Clickmouse.exe"
+ VALUE "ProductName", "Clickmouse"
+ VALUE "ProductVersion", "1.0.2.3"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x804, 1200
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_CLICKMOUSE ICON "ClickMouse.ico"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE
+BEGIN
+ IDS_APP_TITLE "Clickmouse"
+ IDC_CLICKMOUSE "CLICKMOUSE"
+END
+
+#endif // 中文(简体,中国) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/ClickMouse-old/ClickMouse/ClickMouse.vcxproj b/ClickMouse-old/ClickMouse/ClickMouse.vcxproj
new file mode 100644
index 0000000..3717972
--- /dev/null
+++ b/ClickMouse-old/ClickMouse/ClickMouse.vcxproj
@@ -0,0 +1,302 @@
+
+cceux4NZz%RGbpEv^Y6x$!}Al zm%Nq|6a0EoOz?Zj(ZM^Q-$;xJ{@=tXNaUitxbQ`3abW>b(b2&_hz|)od+ywePdgDW zauWUK_}ta2&uXuF=d9*E?>!CnKZktLQML1^wJp%T4WQ3h00S1-C(3p}|HQs4{?)bsTTGz%|2uEKMtkp#KUu#Gs;`AC+knC5zZ>(ISg4Jk(xR *If#aBfrmzd9Q0_G8VT9nIC%(_`n%A@(UwK4E{pzP_gh z&A(&Da>&ZX_xPs8uUr%ty=Yl-^pf?7F-r=PqZa=xF>3K&!2Ms6W0vfI)FsC*sZWer z)Rq*zr~}djsZ5Lxs!WIsd^I5=;5YFR0l!QL4@!qlNQ@3%932)sCv17}oDkRpyePf% zm=pHG!}y20n`-h~t9P~|{_h6=hgAOMdH~1%M!xVw^H1OYkol)J0B#3R )S*$_3C5cf%8hF=qeKaX5;6I6x z{$C|V1?<7Tg4n1f1+kIKZkjS>%4EDZ#RO)%fKmYd(b<~cF2(@v>_+_WHvdL8K=%EP z;(x9$4~G9I-_P}b(l=jsxppt+?A(Wbzxn9 iGQj;+=2Q3yWV+S z@K0?3uK0KMZuGutY|q;wF9h#kR ygEoMd!T* <
Ai@qU$i-WJD&|L>j4!)<#i jg4mzpe_5Q_1L9t`1K^(Q0PF(QA%eA}NZczb=%d8Qp!WE1zwL2hez(LfTQG}k zzzN8QVfmBq{{8g@ZI!zoYOB~@h&h3u4kiDxf0WZUKKj}J$FV>41JbuYZpC_? zg1Cs_*~wu+b2FlXo==JNe>Ej4pe7;GUvQoj zy%@a04oG!=nSZ%GfO%JKg6{vpe4qv!Blt((0PeYj?7+u3-i`fxlEVTP#fJy@Mu!Am zg6E_5K$1~iCwROhZ)WrE_it>g+!54T`Thso|1a!-J{Hh^901n+QN9nreqYuc1K4S$ z&(Dwp ($IVeW#no0+P`8x@rFh?e(JlkNf@P_CMO^cPF(0AQqTsm4$bsJwOqT z6UYwG^|xMog@(4#KJh=-0qEWM*<{VU%Uak2YR6~6dx`gNrFy-!-M+ikx&LoRTrUgy z_3gH;?R{uNXsA8X)mZy2+5^7rXsk)u*V1x+?R)Q?jlRF*)$Tv-?%S`qE+s1Xx}*sI za`^k5$ @ z^R4HjozIr0eaVplx*!HX9DqJViUAHo4xyj$EA$sMB}4_)CPghOUJ-Qf1v6)U?}9mV z<{U4Z2vals{^rh|b5UFM?khX0cHG-qx#J(izs&}Ke;yCaeSpk9Y34xYp3`>RgA=iB zz_!eYnr5bWzeE0E13v6*vW@@YF@W6u&-~B76YYX`VSFHLfXcqu#u^}G1DJmrPekue zW1!{sKYnj_`DZ&Pvrq3NY=X|d)do=eU$3bCU1p!sM*O3#PvO5Vt{V0JsZ*z(j?zbd zdC33#{O&j>E-dI4_}p8P!x#Q0CBlC{*!%#D9%gn8HP|MmNklxL$M?xG!CE5X1lSJU zUO)>!Z*Bjx#RIS#w4cRl15g)0Js>G6_((!@&?krm4kkqgJ{=vh@CPKbXU{$nb)q5v zAN1n~rao0xc2QeJ#ZSR~O mf`L`?UR-ebd&q!Oxv02Bo(QzC9 zV2Axb#{dU=TD9A+@16f= L;j6A|L0))DAfh*h3XeVsBQ6!#Hhf}F<#(rG+rn!Bq++y@3xDP zFH{dWUa=8=YWV$iH#D5vR=w*bu)hN~prgP13tuRW2^ ;qMXWTVsFL*l&vmC@!G5B0k*zQ`myK zxUfZavEfUD&pGED8ZS)aB8SpG9;bhUXFntOuL1v+J9l7SKp*}o4p7?xRKMSaI9!%) zTCYnIHJ+8X9hLjubFAO`pgsZdy)W>y7j@@-==0tS8}P6Fo!SD_@riYrf9?Ym+6Dh? zCzyYVA@<`pjM#UFf7u?$wxGZ4a~`O?^EPW@zq0{xRbzcydp+@A_jE&b^>N{!<`l$7 zECl}x7bHgbfq(yRQTG@8C!!vo7(sElWB$=Tpru9oLjtt4DF2T$V}mO)V;5Is#w_|- zW^B;f%%}kH?-v6b5San~aco^?^x}1CQ9*x6jS6T@jST379XJHhY!ZQX1V}1LBz_ 8}Lzgn|6P|J+?7F_h9XA?gL~Sz`mb#pBMn~zpw%N*uf PvmQuU`IF4J zl|RXfTXt7k%%VjJ5rJXJ;XyB^hA( @A3>yieYLhXsx_~2VS)2FBlK!VFK zzi3%h$fAWIAt9r7-cWdW_=MJ)iksT1ciz=h`Tl0&oz?}jt_@~Qv;XI|K<0q8?E5Lr zys~yyw%s|#<6D@2x-Z25w7tKrQHu!;wvGEU>IY=*Rc*5a;9uAZeGWlF*!@~}Bjy(B zWB<9`kKUK-H{3=^TIIdZHlDNB_e o|PCLv^FU`s5Ch|5H`T-_fx|0dyv#{e+|ck zp#E>|A3&^ty1<`koFL{FJ}`g&O;h^uyCdz?@fmTE*R+ies23!4~YyfYIenIpN^0`#^zZY}=H>}RI -P`-<;_caY#ap(LFR5cozGN9@aGn#->%t(I>-A7fc;<61cu zkjK1jEzZ~Oz2j!>ZsHehcpL-Vdk5+Q#J+9|?DQSrp4$5$-2YG4QT^emEd{VS)_zX% z{Z#Lvc!2pA8fyU38b8)GImo|Lf4-4OvA%=#y7@gFYTZ7Pt(5afKmSYc|043}IgI&@ zMVtSSjc=JW$#UNECH{BDL {xL460ixT0!Qx*o*K(T5xHP`aFun7g|I==pd!2R{ zd^gzuVp!M!@GoqDG%nZ{9}xF6-UmYa=o+#QH1}5?`!86B4Is_@QyqZj0MHs>onlQM z;=V8E@; p7$oqn6uzKh^( rJ`>p(ww#5LVE#Nzf^;04PYZJl)UQCTyn)b*8$!VD>akLicppH)< zhND*o#3qCV#3qIYzL6B__hnLOz*mr?cwQU-`m-KE3_#ES53D^96BWKBAY$dxt3Au2 zk#SYQs#T{oRK7p6qq1^ldu_#U!2g%{PQX_kHC0Ec9w3B#za&&Imtz2Go1<+m+isO_ zlxHLEd7sKW#RIgDqyzn4Ep^q}?(J{F|D*4oVgLy7&tj_&=yL>Uo7VVe{@MT2x Hr;}TfQe%>gpa?jhGM_|`sA3q)Ad|<7g|4DmO<37kvTHmXop651w8!F^9^nE!t0!wI2i`$If{wL)yqOYH#Q{|mGo{5mdj z$&+Er14D=6p-!TEp7!Qzugz=#|83P3zd IXVz6secr@B<}zwcwN=`S|NWfid*iisHh|eC-_9`s#rYH?5dUNc z$X?95<)_*U&;ML&L;puR)<5i^an2BaH@0!iJnMF}`^oR>PMWyq^Nj2x O*rH2gBZ&W?HHh7beZjw-&j;^h4@fZI zPB2F4*igUE;=%&AB}L!ADQ4x+^N&23v|z!4NwF&eN)tl@dXiQy*q<1JehHobc-;oX zV_bqRR{q16Jee51a 8?ll z1#?!Rc)&UTY8meDw#q$k%lx<0*Jv$hoBZ?3|0C)Ef@!SdNo#qMaN8c)0TJ(md-~1? zaZk43<=;K0wbWq!Q!sDDe}{-^D6WAGq&^LB&%!LTR{6Hg z PKNO1+_flu_xMayDW`j;ex zEc``6NZ`NYSE61L5~$I$iRVMxpw2(qFBUb$hApm*4ZnXAuBCQJlEKVN-0tN1gYWn4 zsM! 4oUCY9Gg{R8@EL`M3Z zPwVMn?(FW^Fuw!f|5KTH^6w Qg!n%ey&@nzJRsn>uRjv8a`BB(%L78< zL;N$q{Xt?sE|l00f^C9;e_f8k4t$NZME?^TvGi$LQydvdLj5SC_HXB#f4jb|V%PGn znu?Upn#%63+UhUB{ns1=U`=_+|5KkJY=BMdd69YUS6YwlRqo05@IH)tgWpFR0G@~H z0n9Ev%l5zjNn4wfigx{*wCk_BM4LP3QthT|FV}+ZyIp$>ef;nI^;Ps~R@s JC=-touLADo^mfx9JcEY!a1)LoJroE}* S_eQZTaR|DdbGhw zwm`H8f=T9+`tIAYEi=Gr^6ezVup_bEN4}?$rfVq w0H`dk1JK6Wg({VbV&vT~Pr_(udTHfx!*kF>j zrbetc(2P8)ukNg`UDsM)y{@yR{+ef=d1ivn{$RDIQCmOO@0dA0Hf%{2;{I1-!~Fk_ zSpEz2`5gw=M`Yf)ou6z1>H{Rr=o@$ *bB1AKkYK%>N<_3!nkNK+fY^5yfV zM1=%i78@E^3-12~`BM0QJr1y@1CGU^e*iY&XiQkp-=e}7EsP5BUwE&tFMU&B)c-X% z?>e)yt|AZL2>&_i1aIv_-M?G30WklVdurpq*Du?+1^*pn19ZRFhY9dvI~Oc?lJ2dG z*xLZ!PtVs5zG<6uYYpo7&~0clY=toYT!&ySv(IUIewA@`yU#n~8hM|b7tFq+eb)VC z2b$2v+OV^$xjv< -) zU!C~Jxpn9t$cqkLls63e(kOn19b5WCuw4cAKaLFv_yQv80U{2dSU?E&As&bh4SXvu zG-zpbsQ=P{dwi!4LH?d}x5Rj|QxCK>EbgqUj6fSeX?Jy1M|WK{q~`N3y&cdQ|I}9} zw{`JcRavXdGq;{ w4e0 b8pdDbpgZU@TX^b00 zKSiL1^}%+-9%PaP`` R%)N|Fy6I6bq0IaN_@of0=bk za~nACA8h`aduE=s%su&j+TR9yAjkfcX8+HcxmGoC&HI>f+UB$)&F3)hY#&+keqDcx z4|o-HHa4zqs;{3vbpK+DW&PTmxzQ0pPsc@I3|(YE8}XhLwn+4uQ<`l6X(3krsW0$V z%=3LAF??wvo=>zN4CQn7=iUj+mrsda5%^Hd%7Eh75dXih-#6kPa~j%V2cC^x8Sw0~ zz %~`0Q+@jmbvBq&a}$6 zvuz{h<$Wsq%sp#&_*XfXx8?SJ>H|=>Wjmm En9S{gQ9c7cGKK``2I!k>tT?ev)`9B@h`SR13!#i8TfYe zO8>W42H$tj347?_`@>!|=NkRZW4h`qS9aCx+0tEC@l1Dp-RI1IPeZS7X1@E&zcbd= zV>0Jzn&N$m@40@ja_(rG{XJ`$b=l7|*WB-Cq^bYkh hd<9S-c zx3!@ F0M^%u2r%F)RGy F{~lOS%k`F~=cVrXzr?C**V3;IKJ zNbnDCxZ#H3_I*)75v^|#g?T|Sq5gNGFL1NWJ*Nf#7#|c967U)JHR8O+h^2x4!xzI7 z_GDDI!<_42pVsP%fW7F4>Zz?N>aMTp?5VH)nCt-fKZ-u8qu`X*qPMl@Gq>_SM`=FS zl~#GDZLZ^Uda(KD_@3FPKETc<>zoI5478XFf%OUS4NhSLs2_y-^JMn1?^sVm{Snvz zk}rB1>-VESbALxeeOYU5by!2yo<&16u7AwE=;w E!B<{Bb@VTzor{j+J7w!7+`>bg^k1OHvezK-G zo`rq88r#!;b-W*+%eq^vTZTD|Sg(xd2T@xe*@4dHh9ljLb)W2SsXvJI`(MEtUQ0+? zTkB?R$2e@A{lV(rx0S40Zn^FUp`i<|iwRx0AU4FW20VX&ar&Q;e`gV~0Jx9Fz8LFx zxvvoqe2DWtj9TfR9TOgKWyFeL3_TWOj|cr3Z4W!Jgiq|spz|UycR6bL!VJVZqQ0L1 z-s6$R+yE^xbfFN875*+E#P73&utlFmhb>t)u%8_rSJ&3op3;MFiFMRggh4;ih516@ zpX3lk>xQtOXQp}ENDmkOnS0jEvOD~%_Q1AYA+1}e+W>J6)&0SLPjkb;?xuzh;s1Zv z-CTDo);zkke&^01or@k58u;TV`Yu+8UvPYAU=Nt5KK?_*K5@_W0I;qh#)nY9dB9hg z$9Dj+^nvKGpxDsR;P2gW$4}`whx1r@ABu4j!-LO_4_lOq{(TMW{eX9@O$wa^p?9Tq z0x)*rP*Pa%m*~U%GCneF#pob-U~id{a_{(^Z@fNdZ%f16&bpcij0t$Yr=f;qC!`y) zADka1)`yON>)J###*fx2>9 PELypzbidH{F(H)uxGNMNpcb+pUFyzc_t?@4r8>rK;-ueJxez_taNs@2jtTVQ)j_tB7mAVqZ^fU7R-3 z{rCUGKKk-8Z%>`OC-0* C2hw(=KE2-p7-%QV57ReJpWlvvpo>(>-_I+tlhr1 zsrLE(O$}wJN6l>Bwd>5<*Iys>`MYw#oH1j@ Ir@Fygre9cTbTg|kd12 4UHFP({O98&&c z;RA_%610c?8tY-W n=pXnpdSxK^U;2}!O9Ov0d9r0RubFEyZ=3^E51fd# zC?@W0Z _JRR9YjG=H#I6{ i20L@8>K3 zyzD2+Ki}^k(C)|N|E%^tdR9?C&MP7u>uUDC+1nC$sk=FFUnuDPerG87{lLzhv|rDK z_+g*?>DQX`r8ii#Dx*`U>Tqh69T@8$b6^h~2hPe(mi+|z@54HPeV7kpfDV0uHeWUM zLJ%y(aanO-+*1!f{5`4zIvah3-NC>kJ xKR62=*R6+8*#7gWR7+ z9YE(<^z(H9{J3@+JJ47lhUhqeU&|Ade?N2pJYxC)*1ji={m<3@^YYL3{G+oDXn!-H zgO~Sce?F?qYxYt*e~QrATz|Z)wc$v2tCz43=;~?nHTN_(JO$Z*1pWQ8u2AUTCG+O} z`>b1Uy%2k1P}@JwSS0<9wNUmwwCQC|jj9J@{vNdZ$C>P>kpGyi{{!d;-+_HUU@Vd> zG-AL1Z-0C8NUS-$tO~o3n3NnC=ka)O#=y4m2iw}NZ)@{j--&h*I _hH-&y*~5^Sa*!`cL1zMjskMsPHjK@d64d(*7dg~ zB0)FEj|B$S0kkJT6m9-J&^KV;Ux4lVk3B%z19S#J4bB^_ VOXz*9h| zx5eMo6|8@wyRl&{VPDXj*V*Kou^;R7Ngqn-uHUw8BKGN|elvmAr;X%~t$(GtIgtDR zXE(@R#6CVX4mN)W`(f(k@%_7K?JnyB7;><$M-KMI!C9F` w>9|l1BABbpX>_ =EL z1JhxPdh+3izt+)IKY3p$BstI?Qt$6*v%S+5UU@JaTG<_Fc%;`~`%I6w`Z=`!{{#8| zJLG>4)*Uya4*=A4VLWgE?m?_Yz+MD3$51DH1Ur2n>HtE2yzif4P5|FufE#HI)b)oN zvB!C1-KlV(_88jwW9`10cd)i$e}})ew`gg8$vy z*8If&aLdZ~dOKGf> +ubfb*xfDdXlc1+T~*bW$>xU49qG0{vHVb (lLlhSME^y7z&Ou0Tykcc5lZkFVyf z{ejw7(Xan~chLI~`YAu}YHV28+w5P6`MOgNVjR=k)btgO<1VCp55; yMDJbLL`mr=gfm?yn$sE7nVfdeDS zfsT5}KgP`@|NEKz*BAEs>dN;A>L1?USpV=r=n4)58@Azk`@Ud(sJF4cvp3*7g!we5 zphq}`x}XnjIP?VA&mTGiz78PW0M0vRh}Hphkv4DjX}o*78}i@PSlh8bSl@9VSik3B zQ{7vKn(AKN-{k%MzGnYJy^#N2UjF@O @nj zr+ok1*5KRuR-<><+ou37uy;GxRJ)U*6?^^Dm>zwE525RO8uI^p^!2L_wFXp&I$Kpo zI>YmicDK(x+7+I2xHt5p_j+1?c%-L&>iZoXlMggCP4;cy{-wtsulg5SLx+@;++EBc z#h>mpYrea<%;YY!=elvO_RGZvSy!=M+UwEDKS`E*UjE^p^yrjcw@!(3xRsmB>;*qq zw%GH7hu5sRqR+y-n3*ZWJ$w#4x@mps^2Nn}`+247t$WJsCzh62xy2qc16}{D)W+Rg z;pA4|xAfiLtzT8Sdd0nlyXVZhRQG%${o)w6Isd27^I;D@*_INcq9a-6`FnDCK>m-H zXr)`-I@NO}_98dJp}x#$>CX(mAP6B`ksMfl&mtG({<$R{(^la4Vz-g2bn3YZhmL`+ z7r6|0W_S #19xu_$PxF0z7v}R4+*r#S2iE*zf4@4ce}BbMuwXi^kEb(!hlo$`5;$ ;Lcbe*X4r#=AA!{u-uW}6**Vq>qH=k0m&$?8$M zf7d0H9|EbPhy#W^)el|zf;^8Y*X=gu9fI6PVu0M|b1q{Xr(F8H7MHmo;52I1XcUU; z$B!RBTF-x?ad~ET_RX0NbHQ}CB~NP6C^gu3|253#+XMLzC(A$V`Iy^Bwm&KQ0Mb*i z{bPR{>HBt#{5hQObH7cOQ<*Ooldf+pa53g7jiOQ`kaD?j05 5J~iA8-FzTaWgh hgCuCzN`lzyQe!ZvuQRFD)aMuUeWNX> z1$u_dfos(g$+vKh &X+cLR34gvq}{C&B)<;vnYtLjIK++81laj46WrkE&c2 zi20m2kU3?_b>mG%>YMGlg|9ob3;lNO!XC(ayzPhVqisaJKy`po9fAC};ta^gEjsn% zy26~ }^xO^Bt>R{XLsOnS=fLA3|II5bXQAfrIGRzXRFt8&v*b z`?u>PhwNJMezf~9IkZxpsZgrZ=c{gs?KvQ< JE5=3#(Mn~4!x`w^YnY& zM&)tX`q)|?lKoWjPyK%YXZOjV>ytFwwBil47cL>To^SMJm_U)hfzOcxu#aD7DN=2= zX;go*Y1F&z+MH;6k2asyx)Q80pguT;{y>Lar|xhVb4ziK?NqB?bqjO}SA(Prp&z4h zI9ne~`*c$MgZ}!B*n?kfHAr>Xqkj|hc?U30_W=6!A2Gc?>VPxyPuH;VVXy9DwEI}c zbIPTYe&B$f->#9qjs32xJP32 2n|}IOhWE-D7n@KgIy3aZPBp8`V4PhMX77`rIGQn>XubFlwZA0<>0e z$`5}yZHnER>$d6@zlJ }78t&^kWUX>?|% zPQKr1kT%&g^Z#MXpMRG J`bU!cAf zd)43SFv;(Anq*sW7T@0>_s4)p4Dt4!+I`dq*ux7te#n2cA3%Ko)Cqcdw@okhS#{z! za6b1mqW#ueCtrv?henb`Lf8Ta&X)rj)22=Px<;eE(N>g$ee4uoocrK)X_bc^IyLG4 zSer?80S}i^4IQES1K<$W# *)l1#xTtl%n|Bec$<_@ C LK4B4<-N517eO3?0W|3aoG8KZF&hH-GVdk zSJ`y(pHaJi>trVTG>#E|0tc>04nPNRo1;jv+F2x9jXJieB0#p@o6a=Xi{XmOh45dz6O?m75H z+jrK-kJ|BBdrxgXK lLU01u zw+mx>>d!}IJyGrxuRYZM8&Nmt7xdbV;#X}3KrfRNV$W}+Uy%RALLgjUu^h 5GaifNX^%zx1cO!bM43bNq{pIo%43ynahavhx-F9D-6rW) zk4e52dvokS9Z-uoyA6n=7jYc~j^dulKI(;Y$$vlUfIi?uw?Xy>=Jxy*WBmu92b^cn z$mThnhHoOH$!0MUX9`@gWk^W)CCvfq2Q&RQY<+G^k&@24ei?Paao7c!9+2t)+6$NM zi5au4xy%>~FrZ$rU@aYhI)L+7Rm{a004~mww7}kO#rhi?*4|jL?gst$xStuiIuqJy zxb!^Qx2I>Y-2+bQ>jTuT(|gHqpnXpQWMBFT@Sf8k-i$dxzjPYZIY{3a(mB8t`uvx4 zQ5A?EAr6p@J>6!^)jBll-{AcBKiD+N19q+I7|wtF_>BBR9^>*4-5~k`Xq%b5GFgww zFx3N0#!(kwe84#@7>5INP4etAqb`Ab^YYI6?FlkZvLBWIM46XhU7|P!oJ}384;)4b zWFBW!NAZr+DD8F_qydLXvK)GX%3myTXCrNbeQ$&cju7nS!vQ+GR;w0&Lr>>oXrzxi zHS!l+8fC4M`T;uLCJ1{v =rGO;I*s$ITn35Qp C@a9~6^ zFox`PWEZy=DmK~+<$r`tU? XdEy`E}u2gtuHLFYjbUuBC?muwmI~YZCF>+j(PSU03V`{-B0Uhqhs?k<9EIt zFGl|$5gyp==$>2x|6ZbdM)sp)e>MhS^-OdefVTc9 I zfce1DH8%X5JJJo1eSnbM?ti*ApYK=1#{Fi@-vQVdz=E;AMci6qp1;FwUhuNRe0LGz zklIbEXLLG8I7nvDQYfP{Zc_C#Oyp!oGPOkolDIPjvvR2V%NF zzI`9iwxdm_e*D1k{J` Y4Nh7Cd7>aj_7pdNVHZIc%*F4sxRJtjf^ zFZ)s`B=BN!K%<#^jdK1^vuLiK!=S#?ZCt2=EwI3Dklc^@U^V&yk75k)2Il9!0U57H zpS=xkJLLX|%cA%Iy8h$1{v?J|a8CjsLH-Xz{@(-k1MRqPhg%Qqf?n_M=-)r-GG;&K zwk%lZG%cufTV$0^vn0RNk(&* YyI$$$oelzykeaUTB?1G-I8e{!^C1&M2!27@{+!H B-60^Jq z=qfhJnoCTwYC^G5`jXp#`9cQqqfSG%+hr1)F=uza*(~{%MkD!_8uJFPG=>Z56*w@; zIFLs3_$_+L|D`#**kgMkba2aJcm(bJU)(0;izO!cZpe2{sY%{YYL>SYo8&DeMp+Y{ z2LV6k3GOU0D|X=do6rZo$bi0t%P851_WuFQ6VT$!j$F4rZ`RG<`0}KwH{U!7d=PAT zqpUCp z)BkP$dr?-(2!`n&Cl3dVqzeCB{ycYx%BmCroFQ-c{#hx)r+E3_XYfx*UP=a>%Re#s zsS-F`|F`+HG572QUS$6P>`B4E(e6Jmd(O_l%iVuq@e!R>#R&dP?&5#R0x0k&&Kh Ib2INaTP}KO{;AH!9mtjQQi) zluCa4&f$+S_mJOHm^>F!jn9|Czbf{^XYgmA@C2mz{#^b CN%%g|zv`U+v7Ar%9#7&w#=biT(wD#hBtOdDMEVE%gPN*=-&28!{jzxW;f*uD z^YKSye8$8Bh!X%GTxZ2SVi$@2iB((tJ)XR1^3M96(#(EU@#M!pWfuwlozdhE^p6FA z&ts)0$@@I~QzV}Sb~2W1Y?z!Jc%na&KcqiWk~P%#L-@07d3*5hdHvZb@#g&pNgl^_ zMuQ*JKURjb1`9vtU-eo2qXecdd@M|sz;pR$4Hi9<%)v63eT1Svq(9~0pxhZeTEXWM z=D;n;^IHKukS3apf01a}zcEMn!+DpRJU3^quAF)ek1Ff*t37xI=FnM~qw;4}e`&(% z%4_r1mS_BKL* S;=p8JabWvNCZy5?f0qpI?T|9G%s z%-%JN()!kbR-$o3DlElwVExbV4%{_MM3Dz7)B5f&8}p`3|HX?UdCN+!pSq?zBfNGo z_#LBpBU}d1xG@2n?!i51Czr4xmX6hn(;~kr8|!rxOt|Sn<^$sU63R;r%E=kpd3r%x zBCR~l$u7M^`GI_ktSB9`U9DzkVO)@8tSTF~9Ob-^$~ct^#%rE#xXH98-}C7scOCE` z!n&{QYA1+K8|eg;>L*TIQ=WDR^s} MwBI%2TMhfm6ho&M(N1c zORLJpqmD#919=^a_FsdqgJCoLHpgUv(#i5*vFLPFNv3!t`CnBfN?%=){=4-RqR0lG zekwnphvzrBMB8Ar|C;<_@9^JH8C;7x>6aDhYeupRQ5(9hG;PPaiiEP0KtGk0Pec1d z|AjOrlq2Y*IC z((piKdUJNRi24~L@}vIDhT^m%C_h|c`5BD 9*q8! b>#@t&+{Mj zZ$$gW_jPza#%Ya}amN31TvK{C0mT0cLH~MB`iTu?h;I=39|A4EMcqUA4e$`?Czl7M zk)Hh)AeYYrq96Uiku5*qKTrQq{3p5?-7z}(^pKnQoR<&EKSuuum;Wa~|2j|FiS^)r zBK>^(JD}_npD8au+iw!nfonc}iS&~Utf@#JS^lq{d(B#upY>&FTyp;{o(9mz>POJd zyK%X|vs5xc{3rU?LVn9euphm;a_%*&-RURRmZH9{1W<=kzVjd&C>=aVE_o!Tg}>%q zCciQIN3{M#`T3=7+=&N0W4U!@W4QI@W4ZMe iTsQzU0>K?gpl5`C#?jui zgClg13qKyw_qKCwjsM_U1OMQHzHP^L?%X+I{Rc+BZ|{jvU=P ddM~j1SWnN$(%<2)J`qA(t&O0eu?92&O|_sS z3c7A>s^LOJD}lX-_v7@}aBa=CQ8d+YZFoOK2;%$3>Jg{EGf;ax8~_cVo#G_4F*=Br zGkE1Mf8 JbwffLYTp^r@( 4`^NR(;vs_S7y(K9PC9}kzUXpr9GN%`nJ8
rI@bq^eUGrzn;3RXRd7uLQt^PeI|CC=u ze d(F3isU;%6D8wbt#)Z)@1w-{z0z0pov+ z{tn_l(1|>`d)ALQ@toUP9;oL36!h<9^39hwp6^6E@xDFiI~{KFr_!IKxsB4>+-B83 zTxQitr&-nKG$~I5e!E6C4{10ro!7Q)&rb|B>^Vd-5N-rNSs9{w#0#J-p!{^BJk0;e z3~mAF7tg(&%ULj+WBG-2#p$Q_8SOsQVg5+C(c8LX$BtyZdb(XJvAIl&qfV1Nf^)eK z7F$#=xy{O2mr>E@GO9i>6-n 9+k^Ftf1x1JfpP$JfUaEm-Q4`y z(KHwflu>yhSz+l+q@8`&7YcZj^@kZ&o!n|S$Ub%&Wv88b*;96{_#0O1^s!d4_-dz4 zvD&SZf8sPMn$_w#6V4|MzU|w;)Yed2+aB;nh<>8GwK0k|xZ!}8d*;c lBCVdU>DAp!^kNm(FKC>t`#H8LS$4pH-uHW%~5#=Us2L zd8_}U-S4eNKJ@W)^R$ORbBnKzYbN;X&_8QH8j&uNRn#@ehrW(R-&?`@-2?0w`T4VN zuxk|!pugX$Rs5OiowEp!JwW;<+cffb9XeGA`SY3D?V2~ yY9{L)O$`y$Pkmi2-kxxvVX61E*9O>+)aqH|LHA2Q1a$3GXJ=nG814M? zvNH8mWo2cbiFQ5=a?$Qg=ne+*y8I2l>+;vtwEOGc3;S#P+Wd8q_CU?yu3%ktSJ3<0 z{oy8MbMsmCjL4Ino$1ue9|ihRW}0-l@_$VX|3Y2EES}DBq0IVi+a@kwQoQ{ai`;$7 zmzJyO8TqB6Lys~7S^c$JFF) KiWM| l$J}Q5ai>Y~G1}CA zmq~ikVU)b)G%LP)v1mM3yjG3)MwIVWXe+%Qi{b;&f5dH+H93t79xt}Z<|nsJ=L+v) z`Gd|3*8Zap5NngptM7HO=oaGrY#fMAal+iglT>xX?M#ch%V^di?nR?aZp4Mbw77(AO zH4!(L(9Z*V=9-FY?pjwd=9e25jeUA!<(OyJSB!mpb@|xR2TI3Nojp=@NZS1+SLHsq zC_PN`hT?OHpf4s{ALhKUxkM|=$Go!CnR)Z)%+j<6%CB05xh4H &K&GgfWI%??6 zF&`+hsv`Z}pINW^;paues`7C~u!r}rr?_~KE*$Zl1w5zu3z&b=Q(^tWwZo->@_TK0 zdKc;BDekl4OF;w81EKi`E6T_GYPj*QEX$k=`+S7OpOoeSb`1E@ecb+q>jxI4b;JIf zF&rA!mZmRT2irt)`cuWtY$>p5G5ZPPM>*|VWXl{do;qJzHk4#M7LOlcQrI*vf#PTO zaJX?=$S;;3lvk7oRi4Z_=No6@`-p$b20s0%;zxY(_~9RqAJ>?ZfVo)Xl!@V;@Adl9 zG0#%`o2mRI#UHm_;dvqrJpZYVxW8na>U`r&e1Bsx;-~ou3Gv6{qO_+1(FsspG2Hmq zQ~YG#PLMx}pX`uv`)SM`%s(fZhzFGZmBUQ`I>f&|Mf{8hL<11FhvJ%Sp%g#a;z(wO z8~+-_zYg*9@)s`yu{bE6RQW;Wki}m Bf&wO@G32br|WSbikLpp~!xa@l4;xU-} z0W2AVGMWK519Ms653F01j{F}#tn$|$*!gUm|DVv80l}RNA?E%QdN#V>1wGnM=n12s zYkDt)_nQMdxF+vEh82Hjpyt_D-aZ9A{299x*{aB91=||=lWmIZR19PXf <#NZHBiEk>2*f o^szk70ebywv 1J-0Y!6RBEKg7ijh zA?>^^f$6iM2MpGyYJaGYmQr_ |FFZL_=Q?MWq=+xIsUC%w`PXw_jZwuu006; zHc{AKt_$fC&%T{oaMzEy759`!`NM2K(YToo-|vn0KbVf&Ap5J!BtHp#{bO#kVx`Nd zJnAqgA5M-l`99RJw+Q;h{&28?>3K=l3%w+F@8VKUI`2QZ=l}Hok^VEfZ1N8^`g>Yx zYFPh^#@5iyykOVMj@S*7pYq|`i{vVYUUAw`r2IbrY!Ejs>}yy>`cPh<&g*qspw}gR zH0hy9pG)b69{Sx@uQ%TRwCNSApacELs+ImEF?=@u*T`F}8rjOk=Yw3Qbp-12Is(4- zM4fCa>0~KyV!Bw^Dqd*|)W-YYHl0F?xKEo3rN&g@LYMVpk4gQ5RDP+RQF-VJ`tR!W z*Z(qDz3cVuul=>ZrGD2Il!wy&t^V&~xD_9NK#w;UI=mCmpRPz1)^MM>w2H5|jCsdw zT6IZMSZPkJEZ3!%f9TLk9)sVflC`8TKGiMsf%iHMs*`S$VuQ<~$g>;dZs^focfiJD z*Go6V^g5p^tk3vTx>L*I3__Rpk=rCc2p!&wZu6OP{u#qP-_O#iJQL3M!_oFWsS6^| z8k~e$<|tG$M@3m!_(+)WS#f8lX#9ju(N`xN6;0fAR5WeZNs;M5M6`?Jc4cB!CDa$4 zcOpWjsNhIXL28M~0I#P=ZLz`&XMSnxOUHhHQ$ fv~v2ii_g4FNjf$`7Ds`AWl4;98*&)8|0dl}*T zm5F^xdWN+a%ZK`YeQAc0&ArCE)aPX50qT?Dn!aDNDE+CSzQ_1VO>+-vyukXh6b5|{ z&@-%yd1k2Z*W!B`AJMz?4fVx&5IyV8@%@ADaq4yD(f;bjC0N_BB%Ry5lz?ksO=ZTA z@wYebQHL6Lqutqqz8^qta5ws6(d(ART|<5ko0yXN7Syk!{(~V`#=W)m&(V1uxDPee z{c))DcQ#Z{3pdt8qH`_kSfAi8|NR*HA?S;skI)uuxR1U!o0XFsMy1EBk$fvLJe2sf zHeXF0-a{Y4%jGGux!3>p9P4ACEj<}-YWTKAFTWKw^H wG}XPQ1+k>W1k|0I4-*F;BW(EI&AJ^GvH z-+1vE wWfET1OEztg!cATB2i}+^sjh7!ihxx3m}js`2YX_ literal 0 HcmV?d00001 diff --git a/ClickMouse-old/ClickMouse/clickMouse.hpp b/ClickMouse-old/ClickMouse/clickMouse.hpp new file mode 100644 index 0000000..3f1923b --- /dev/null +++ b/ClickMouse-old/ClickMouse/clickMouse.hpp @@ -0,0 +1,48 @@ +// dllmain.cpp : 定义 DLL 应用程序的入口点。 +#include +#include +#include +#define RIGHT 0x0008 +#define LEFT 0x0002 +#define INFINITE -1 +#define CLICKMOUSE_VERSION 0x0003 + +void MouseClick(unsigned int MouseButton, unsigned int delay, int times = 1) { + if (MouseButton!= RIGHT && MouseButton!= LEFT) { + return; + } + // 创建一个INPUT结构体用于发送鼠标事件 + INPUT input; + input.type = INPUT_MOUSE; + input.mi.dx = 0; + input.mi.dy = 0; + input.mi.mouseData = 0; + if (times != -1) { + for (int i = 0; i < times; i++) { + input.mi.dwFlags = MouseButton; // 鼠标按下 + input.mi.time = 0; + input.mi.dwExtraInfo = 0; + SendInput(1, &input, sizeof(INPUT)); + std::this_thread::sleep_for(std::chrono::milliseconds(delay / 1000)); + + // 模拟鼠标释放 + input.mi.dwFlags += 2; // 鼠标释放 + SendInput(1, &input, sizeof(INPUT)); + } + } + else { + while (true) { + input.mi.dwFlags = MouseButton; // 鼠标按下 + input.mi.time = 0; + input.mi.dwExtraInfo = 0; + SendInput(1, &input, sizeof(INPUT)); + std::this_thread::sleep_for(std::chrono::milliseconds(delay / 1000)); + + // 模拟鼠标释放 + input.mi.dwFlags += 2; // 鼠标释放 + SendInput(1, &input, sizeof(INPUT)); + } + } + + return; +} \ No newline at end of file diff --git a/ClickMouse-old/ClickMouse/framework.h b/ClickMouse-old/ClickMouse/framework.h new file mode 100644 index 0000000..20835fd --- /dev/null +++ b/ClickMouse-old/ClickMouse/framework.h @@ -0,0 +1,15 @@ +// header.h: 标准系统包含文件的包含文件, +// 或特定于项目的包含文件 +// + +#pragma once + +#include "targetver.h" +#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 +// Windows 头文件 +#include +// C 运行时头文件 +#include +#include +#include +#include diff --git a/ClickMouse-old/ClickMouse/resource.h b/ClickMouse-old/ClickMouse/resource.h new file mode 100644 index 0000000..d657c4f --- /dev/null +++ b/ClickMouse-old/ClickMouse/resource.h @@ -0,0 +1,39 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ 生成的包含文件。 +// 供 ClickMouse.rc 使用 +// +#define IDC_MYICON 2 +#define IDD_CLICKMOUSE_DIALOG 102 +#define IDS_APP_TITLE 103 +#define IDD_ABOUTBOX 103 +#define IDM_ABOUT 104 +#define IDM_EXIT 105 +#define IDI_CLICKMOUSE 107 +#define IDC_CLICKMOUSE 109 +#define IDR_MAINFRAME 128 +#define IDD_MAIN_WINDOW 141 +#define IDI_ICON1 142 +#define IDD_UPDATE_LOG 143 +#define IDC_RIGHT 1002 +#define IDSTAR 1002 +#define IDC_DELAY_TEXT 1003 +#define IDC_LEFT 1004 +#define IDC_DELAY_INPUT_BOX 1005 +#define IDC_PAUSE 1006 +#define IDC_STOP 1007 +#define IDSHOW_MORE_UPDATE_LOG 1008 +#define IDM_UPDATE 32776 +#define IDM_UPDATE_LOG 32779 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 144 +#define _APS_NEXT_COMMAND_VALUE 32781 +#define _APS_NEXT_CONTROL_VALUE 1009 +#define _APS_NEXT_SYMED_VALUE 110 +#endif +#endif diff --git a/ClickMouse-old/ClickMouse/targetver.h b/ClickMouse-old/ClickMouse/targetver.h new file mode 100644 index 0000000..a186354 --- /dev/null +++ b/ClickMouse-old/ClickMouse/targetver.h @@ -0,0 +1,6 @@ +#pragma once + +// // 包含 SDKDDKVer.h 可定义可用的最高版本的 Windows 平台。 +// 如果希望为之前的 Windows 平台构建应用程序,在包含 SDKDDKVer.h 之前请先包含 WinSDKVer.h 并 +// 将 _WIN32_WINNT 宏设置为想要支持的平台。 +#include diff --git a/ClickMouse-old/LICENSE b/ClickMouse-old/LICENSE new file mode 100644 index 0000000..a23589b --- /dev/null +++ b/ClickMouse-old/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 xystudio889 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/ClickMouse-old/README.md b/ClickMouse-old/README.md new file mode 100644 index 0000000..20a6d21 --- /dev/null +++ b/ClickMouse-old/README.md @@ -0,0 +1,73 @@ +# Clickmouse +>[!IMPORTANT] +> 本库已经停止更新,请转移到[pyClickMouse](https://github.com/xystudiocode/pyClickMouse)来获取最新版本。 + +[更新日志](./updates.md) + +## 版权声明 +鼠标 的图标 Icons8 + +## 介绍 +一款轻便、快捷,使用C++制作的鼠标连点器,文件大小<1MB。目前项目处于早期阶段,功能还不完善,欢迎大家提出宝贵意见。 + +## 配置要求 +配置要求不大,但是releases中仅编译了x64版本,其他版本需要自行编译。 + +## 编译方法 +1. 下载源码 +2. 安装[Visual Studio 2022](https://visualstudio.microsoft.com/zh-hans/vs/) +> [!TIP] +> 需要选择Community版本,其他版本需要许可证。 +> +> 安装时需要勾选`使用C++的桌面开发`,如果你有其他盘,需要在`安装位置`里选择其他盘,要不然你的C盘... + + + +3. 打开项目文件`clickMouse.sln` +4. 找到`源文件/clickMouse.cpp` + +5. 设置release版本 +6. 设置架构(更多架构可以点击架构->配置管理器->活动解决方案平台->新建) +7. 按下`ctrl+shift+B`编译,编译出来的文件通常在`<架构名>/release/clickMouse.exe` + + + +8. 把程序移动到你想要放置的地方 +```mermaid +graph LR +A[下载源码] --> B[安装Visual Studio 2022] +B --> C[打开项目文件] +C --> D[设置release版本] +D --> E[设置架构] +E --> F[点击本地windows调试器编译] +F --> G[移动程序] +``` + +## 安装 +无需安装,直接运行即可。 + +## 功能 +- 鼠标连点 +- 自定义连点间隔 + +## 下载 +前往releases下载,更新需要替换clickMouse.exe文件。 + +## 使用方法 +鼠标连点,目前支持左键和右键。 +下方的输入框输入间隔,再选择想要点击的类型即可开始连点。 +```mermaid +graph LR +A[打开鼠标连点器] --> B[输入间隔] +B --> C[选择类型] +``` +鼠标连点器会一直保持运行,直到关闭程序或手动停止。 +目前支持暂停和停止功能。 +## 内容展望 +- [x] 连点功能 +- [x] 输入间隔 +- [ ] 热键启动 +- [ ] 输入次数 +- [ ] 自动更新 +- [ ] 设置 +- [ ] 命令行参数 diff --git a/ClickMouse-old/readme_images/AddConstruct.png b/ClickMouse-old/readme_images/AddConstruct.png new file mode 100644 index 0000000000000000000000000000000000000000..1baeb1d3ddba317d0710378d15ec6e201e78cc45 GIT binary patch literal 6175 zcmbVwcT^M6w{8L?2%&{u1p*?{l?c*XXd*>HdI#yD_udIjz(!H3C;=$}1Vd2*p@Y(U z6%de)bZIaC?t1Iq_169Ctu=FI&YZpH%-QGLdw;VN^>oxJ$yvz(0052I2_-05m4t zSKa^ lm?!;O80p@wO>|%>bG9BvSl3)7TJj66j;#9{YeMnQUup349qU~` z@(LfjCK1i)yWBmen3paC9S(C|cM>-hHQ$+!Wa)U=)rc2fc1@OQyI4J;t`pp@jzLP% zXb7o&aKw;hWo~kwdpD)|@9Ic%NNX+(^iwrDo>=-yh91o<$OpeVZ3*~cBu2>#Xb*c& z<`vndcHY^+p$q@sPeb~#2+OXR8)l$xkgk>r)z%+@S HO{~!gK6O;?$I1c(4wkwf{y^UbUq4MxyVM)2KXc)`qKfJ?H4~ z4q|DPmKhwIimHpif<0O+7^z($oDEWmF{D;B31Otv-y+k(5sV3&Ifp>OGA8V3Bsx8n zm8b0I IDq;VDhtUnXJ&xl^L!tHt~d{B+y$HHPhE*3Z$t`=;zE(N4prPUykD z#ZqM>?aQznMwQQ+FaM5|^w@VGTM`CB9XM*JLoH^<7@N5+e+0CoF$l^-Wh7W%!mPj2 zFj(>9>y%n0MNU5^dhkC^-U?pwa{C?*BE3FXTek?W#Wo>Hh#3_1e 3tI6UU6Z;ZBfov37@eVP~k@S*95{Jh#zv|r~Bp@@Ag|nR#JJHblE^Wky?Ir-f zQSv8V`GIeph_ Hjnu=X+il5D;E8^I{?_ o4!XgeT%C`v5WXF7228nWS2twZdht2mgDxI)BKnsa2gZ%G-HC56 zr$H22R}oM2rqEQ~oIzlougLj>JMNyrCXI?gvo>PHkl#AywSeF_A4dHlqBZha);JEw zTXZ)I81IT~wPsK;BnZ)q#r%|hNbwZrqE}=tB7P5rGA-B $cgvQ|xQT4z`BT1yj+noZS6nMxGJiHx*pAa}d)1$f$o4Wq1&1rtZ@2nmP}& z%CF#gJq$fqN5EAPq~$Nv8_IE850xZ&+S(2DL^2 MQZSDr02# zKxf`i6HTRW=4uV*2*W?mk+K@g{AaSfaP%(5URYxoec9AK6ZyFsh!MpL}U1x?@I> zcD9?gXMTrm%9e5G3sc{?{(5g##%|R~_~?a_B7#mp+B(W*@lLB)k4jYZ1!^=sT{tO< zSV1;M>Gd!YH=a>l>y8rW4%Q@RlPFf)(@5u4>|N#l?T!VNt-W%`_ahQ?9xyk}CWYGT zNdZ?c^-94_FPOe@atr0|-uc#>Mj k-eueWkP?8 z!-9qGVYoe4$)j6)mQ#cJwh)BUJf)TR2uPnSkJ~;nw6082++y(7NnIApTDkJYYNC^} zsv%~|c8V j+4kuM&t-qVz(->>|lhJW?79?jn|J2A1@ g|YrAoxDu>-~!FeLM(F`u&Ao&EQr2 z^As_MnIrx7dOR|AL*ibn+nwYZTk@`KJ>` bE zL2a_6rJFPafV;3&1I@nna&DP9TtM{015dkV#E>A9TMuLk4E16KjR9iXw~M30%tW1# zBk{$Ph1p=1T2}vX1;aq?dX6DZk+nkXrA0zWweT+s1M*{QhOC`~psHJC3Ty!xeb?L! zUfkNV7fB2CHd?Kg@L7qdlW%YJl3F9*aA``o%`^d+pz{Qu?;tIAZZn|&;!QVA6s`eE zo3Ify(a=l(J}ssVs3)T%Z&rpBjvRS{AX#GCYe7jSJ=B70uV#G(BqHLK?qk(rEifAr ze(TjhPWYemKD=B-8j?Ci$^O=+yw%?KlyZ$21^#wG#ZgQOitnKtF6Sees`KYHXO#({ zYN@51q&D40nf1#S>fGUw61*kIbp}H`QhzbB{fcS^9_5Cyuu&O!aB0)Q9#poADcs~M zc9Xb>0q_X6ck7>H^{=p EIH$%dMF)6=f27J3A7c_jYp4bw6p4cQcAI7 z71>IiKVY0skFxn5X?nMfeR@FbqZPy8)_}(O;@Qw(RIXo{{H=V_d$xNGM(fan3uQlM z={iyAr-AZS*q=h5nL7guDLqB}Q*XEhK-TJsR9T+k{yMTDMnz!6 Y#}mdZ*4e-r|mH>w^_f+{#vp!)_WIR5aQMQyYJ&WXNST& zk6Q&s{jJ{e_znpWN0hyiM3NU?)>*o8q}Ja6@J|W3&28S+>W&YtRFd$WQ #}t7``b0 =g zd KK&pR8koIUy_-|S(izAj$}r^f&=!6*90HOq{% zjhaqmLg%JOhY?dT*nn*t_DL&B+pxZbPt?kY(N%|mY$oz4YwV9a@y1&utW=X4eJ}2o zTqRUHcF8YxOBBzIEBUv~xEP;_fjjVtsA&x``!3c>W^LTf$ @-(%ZVIECZsFkGxO~f-k_!zwxkX`2aGt| CkE3CiTmMFu zFqNc`x7=jqxn)})^>x&PM+ii;8RrG{tCs!qC9y##kQM^*zU%)<;Qy8DGk{Ij^N*V4 z4=ev^0jsFLCW8(flJMWUolVcFD3=8lLTgv8w0L1TJB &`l2${vDzvqI#|C zx(5gZ;%@JhYX^6MA 3Xz)sI}61PGJJ;-6oAXoGiJX5T^O8EVQ}wgpd=KKwf(1=ww!O%dy~ zP;Cy6uSbkJxzceyYd?Mtf6%%LqyxGtjR+kwz`K`3(mrq_(d%^jnJ6dnpygCa&!u*< zcTzrJCQ(bb=IA=Ol<$T|F`Y&+CGMWJBFNh^MA41dcyL&%+cXux2g@OfkB|4<7`^jO zF2vuLp}gFL9}R|oCrW`28*+ll1@r_84SEZU8@HpP i9Q*@a+ZGN z$t54G4V;g;;u(Yh=s2Pkb81@W!dvNEpYpEySmAXfcr@5c$!_~0Lf>ky%}`GT$aW_i z@r0ci@T$NWtk+xEh2$uvEO@o4q&$vmAVI(_2(VR?ru^gq&|$(+YMR6)u@777;)V-Y zG|^?`-~Tu;JTOxNy$B;l8*g>d4jn$0v`+PHQ<%%FBl?@JqB{-XQmLICSAs<$bg8^s ziJFKI2r7|d0?1?A4cXHAuc3`iO kca_71V1L=*~PyKQ!=+pac)gNp*uxjBFtSDZX3?Hsh4HC?^3r zQxft&zq|v{d< uohg#)VTDYF+M`r;(udP zuu?|?XyJ4 5cEGLwqu%obKe-m z(vY_yYefI9#S-^V4ZA1-eXQ>yjLn^F4mv 6%JMMn@Hza z*MgOn>D~X-=-^f}V4@;{DWHH3*~3MIiA)3wL`#bnMJnY6GZ8ga118pH!U$0;vUtc2 z&F^$eGChu50{KADulkuH;^ipT024`3ksizEiV>px{Q~@Hb+?06qa-T&gOb|)tPXOC zDapvB4%MbaC+{4uoeNNNz)xGJPkonW=0A>vAURv*l6nHa21j11^dKpVDff51rR0qI z#L6mSu{XDjMc$aOuEh5HIVPfo`_Tph*iflvRi7AmMr3WJmZwc7ihOitxBdpX%dm;e z_%Ig)8DnoiUH_z1AEcgs-}p7rq7`D9)0DR;Q5;WJzb8TXCY{5A;)bppCEJC`=2t?I zr=GR&sZw`g$Qz;e^c3wlq3G%(E8-}H^jOBD3HL-)Wn^bCrUv}!USu(&1xs&P60ZTh z00^zg;4*wB?QAlpz{A7t;mk^bk1Q{{DkrLrW{7FN8}+cMgyehGXM%cpr+{&R+A}95 zEjB&UW)mXKLlXfClbFZKhp?F%u=Wq`+?R!A^PekG