From 59a58e6d9ec93935371ef05f9624597948a62c75 Mon Sep 17 00:00:00 2001 From: lalakii Date: Sat, 20 Jul 2024 16:35:28 +0800 Subject: [PATCH] :white_check_mark: v1.72 clean --- .gitignore | 6 + MouseClickTool.Designer.cs | 218 +++++++++++++++++++++++++++++++++++ MouseClickTool.cs | 228 +++++++++++++++++++++++++++++++++++++ MouseClickTool.csproj | 69 +++++++++++ MouseClickTool.jpg | Bin 0 -> 26969 bytes MouseClickTool.sln | 21 ++++ README.md | 29 +++++ 7 files changed, 571 insertions(+) create mode 100644 .gitignore create mode 100644 MouseClickTool.Designer.cs create mode 100644 MouseClickTool.cs create mode 100644 MouseClickTool.csproj create mode 100644 MouseClickTool.jpg create mode 100644 MouseClickTool.sln create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0953674 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# ignore +bin/ +.vs/ +obj/ +main.resx +MouseClickTool.csproj.user \ No newline at end of file diff --git a/MouseClickTool.Designer.cs b/MouseClickTool.Designer.cs new file mode 100644 index 0000000..fb9eeca --- /dev/null +++ b/MouseClickTool.Designer.cs @@ -0,0 +1,218 @@ +namespace def +{ + partial class MouseClickTool + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label1 = new System.Windows.Forms.Label(); + this.btnUrl = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.delayVal = new System.Windows.Forms.TextBox(); + this.hotkeys = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.clickType = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.btnStart = new System.Windows.Forms.Button(); + this.btnClose = new System.Windows.Forms.Label(); + this.btnMin = new System.Windows.Forms.Label(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.btnUrl); + this.groupBox1.Location = new System.Drawing.Point(10, 62); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(337, 67); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "说明"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(9, 21); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(217, 15); + this.label1.TabIndex = 0; + this.label1.Text = "本软件为开源软件,欢迎使用!"; + // + // btnUrl + // + this.btnUrl.AutoSize = true; + this.btnUrl.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnUrl.Font = new System.Drawing.Font("Calibri", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnUrl.ForeColor = System.Drawing.SystemColors.HotTrack; + this.btnUrl.Location = new System.Drawing.Point(9, 41); + this.btnUrl.Name = "btnUrl"; + this.btnUrl.Size = new System.Drawing.Size(272, 18); + this.btnUrl.TabIndex = 2; + this.btnUrl.Text = "https://github.com/lalakii/MouseClickTool"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.delayVal); + this.groupBox3.Controls.Add(this.hotkeys); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Controls.Add(this.clickType); + this.groupBox3.Controls.Add(this.label4); + this.groupBox3.Controls.Add(this.btnStart); + this.groupBox3.Location = new System.Drawing.Point(10, 135); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(337, 104); + this.groupBox3.TabIndex = 2; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "功能"; + // + // delayVal + // + this.delayVal.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.delayVal.Location = new System.Drawing.Point(126, 24); + this.delayVal.MaxLength = 10; + this.delayVal.Name = "delayVal"; + this.delayVal.Size = new System.Drawing.Size(75, 27); + this.delayVal.TabIndex = 1; + this.delayVal.Text = "1000"; + // + // hotkeys + // + this.hotkeys.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.hotkeys.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.hotkeys.FormattingEnabled = true; + this.hotkeys.Location = new System.Drawing.Point(126, 62); + this.hotkeys.Name = "hotkeys"; + this.hotkeys.Size = new System.Drawing.Size(75, 28); + this.hotkeys.TabIndex = 5; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label3.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; + this.label3.Location = new System.Drawing.Point(45, 65); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(84, 20); + this.label3.TabIndex = 6; + this.label3.Text = "全局热键:"; + // + // clickType + // + this.clickType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.clickType.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.clickType.FormattingEnabled = true; + this.clickType.Items.AddRange(new object[] { + "左键(Left)", + "右键(Right)"}); + this.clickType.Location = new System.Drawing.Point(212, 24); + this.clickType.Name = "clickType"; + this.clickType.Size = new System.Drawing.Size(119, 28); + this.clickType.TabIndex = 4; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.label4.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; + this.label4.Location = new System.Drawing.Point(5, 27); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(121, 20); + this.label4.TabIndex = 3; + this.label4.Text = "间隔(毫秒/ms):"; + // + // btnStart + // + this.btnStart.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btnStart.Location = new System.Drawing.Point(212, 53); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(119, 47); + this.btnStart.TabIndex = 0; + this.btnStart.Text = "开始"; + this.btnStart.UseVisualStyleBackColor = true; + // + // btnClose + // + this.btnClose.AutoSize = true; + this.btnClose.Font = new System.Drawing.Font("宋体", 16.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btnClose.Location = new System.Drawing.Point(312, 21); + this.btnClose.Name = "btnClose"; + this.btnClose.Size = new System.Drawing.Size(40, 28); + this.btnClose.TabIndex = 3; + this.btnClose.Text = "×"; + // + // btnMin + // + this.btnMin.AutoSize = true; + this.btnMin.Font = new System.Drawing.Font("宋体", 24F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.btnMin.Location = new System.Drawing.Point(270, 16); + this.btnMin.Name = "btnMin"; + this.btnMin.Size = new System.Drawing.Size(37, 40); + this.btnMin.TabIndex = 5; + this.btnMin.Text = "-"; + // + // MouseClickTool + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.BackColor = System.Drawing.SystemColors.Window; + this.ClientSize = new System.Drawing.Size(358, 243); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.btnMin); + this.Controls.Add(this.btnClose); + this.Controls.Add(this.groupBox3); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "MouseClickTool"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "MouseClickTool"; + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label btnUrl; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox delayVal; + private System.Windows.Forms.Button btnStart; + private System.Windows.Forms.ComboBox clickType; + private System.Windows.Forms.Label btnClose; + private System.Windows.Forms.Label btnMin; + private System.Windows.Forms.ComboBox hotkeys; + private System.Windows.Forms.Label label3; + } +} + diff --git a/MouseClickTool.cs b/MouseClickTool.cs new file mode 100644 index 0000000..1d38385 --- /dev/null +++ b/MouseClickTool.cs @@ -0,0 +1,228 @@ +using System; +using System.Drawing; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using System.Windows.Forms; + +[assembly: AssemblyVersion("1.7.0.2")] +[assembly: AssemblyFileVersion("1.7.0.2")] +[assembly: AssemblyTitle("MouseClickTool")] +[assembly: AssemblyProduct("MouseClickTool")] +[assembly: AssemblyCopyright("Copyright (C) 2024 lalaki.cn")] + +namespace def +{ /// + /// 怎么简单怎么来了 + /// + public partial class MouseClickTool : Form + { + private Input input; + private bool running = false; + private const int waitSeconds = 3; + private const int hotkeyId = 0x233; + private readonly string[] config = { "F1", "1000", "0" }; + + [DllImport("user32.dll")] + private static extern bool SetProcessDPIAware(); + + [DllImport("shell32.dll")] + private static extern int ShellExecute(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd); + + //参考:https://stackoverflow.com/questions/5094398/how-to-programmatically-mouse-move-click-right-click-and-keypress-etc-in-winfo + [DllImport("user32.dll")] + private static extern uint SendInput(uint nInputs, ref Input pInputs, int cbSize); + + [StructLayout(LayoutKind.Sequential)] + private struct Input + { + public int type; + public MouseKeybdhardwareInputUnion mkhi; + } + + [StructLayout(LayoutKind.Explicit)] + private struct MouseKeybdhardwareInputUnion + { + [FieldOffset(0)] + public MouseInput mi; + } + + [Flags] + private enum MouseEventFlag : uint + { + MOUSEEVENTF_LEFTDOWN = 0x0002, + MOUSEEVENTF_LEFTUP = 0x0004, + MOUSEEVENTF_RIGHTDOWN = 0x0008, + MOUSEEVENTF_RIGHTUP = 0x0010, + } + + [StructLayout(LayoutKind.Sequential)] + private struct MouseInput + { + public int dx; + public int dy; + public uint mouseData; + public MouseEventFlag dwFlags; + public uint time; + public unsafe ulong* dwExtraInfo; + } + + [DllImport("user32.dll")] + private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); + + [DllImport("user32.dll")] + private static extern bool UnregisterHotKey(IntPtr hWnd, int id); + + protected override void WndProc(ref Message m) + { + if (m.Msg == 0x0312 && (int)m.WParam == hotkeyId) + { + btnStart.PerformClick(); + } + base.WndProc(ref m); + } + + private void UpdateBtnStartText() + { + btnStart.Text = (running ? "停止" : "开始") + "(" + config[0] + ")"; + } + + private MouseClickTool() + { + InitializeComponent(); + var configFile = Path.Combine(Path.GetTempPath(), "lalaki_mouse_click_tool.ini"); + if (File.Exists(configFile)) + { + var tempConfig = File.ReadAllLines(configFile); + if (tempConfig.Length > 2) + { + config = tempConfig; + } + } + for (int i = 1; i < 13; i++) + { + hotkeys.Items.Add("F" + i); + } + hotkeys.SelectedIndexChanged += (_, __) => + { + UnregisterHotKey(Handle, hotkeyId); + Enum.TryParse(hotkeys.Text, out Keys key); + RegisterHotKey(Handle, hotkeyId, 0x4000, (uint)key); + var keyStr = key.ToString(); + config[0] = keyStr; + UpdateBtnStartText(); + }; + delayVal.TextChanged += (_, __) => config[1] = delayVal.Text; + clickType.SelectedIndexChanged += (_, __) => config[2] = clickType.SelectedIndex == 0 ? "0" : "1"; + hotkeys.SelectedItem = config[0]; + delayVal.Text = config[1]; + int.TryParse(config[2], out int clickTypeIndex); + clickType.SelectedIndex = clickTypeIndex; + btnUrl.Click += (__, _) => ShellExecute(0, "open", btnUrl.Text, "", "", 1); + btnClose.Click += (__, _) => + { + Hide(); + running = false; + Application.Exit(); + }; + FormClosing += (__, _) => File.WriteAllLines(configFile, config); + btnMin.Click += (__, _) => WindowState = FormWindowState.Minimized; + btnClose.MouseHover += (__, _) => btnClose.ForeColor = Color.IndianRed; + btnClose.MouseLeave += (__, _) => btnClose.ForeColor = Control.DefaultForeColor; + btnMin.MouseHover += (__, _) => btnMin.ForeColor = Color.DodgerBlue; + btnMin.MouseLeave += (__, _) => btnMin.ForeColor = Control.DefaultForeColor; + Resize += (_, __) => WindowState = WindowState == FormWindowState.Maximized ? FormWindowState.Normal : WindowState; + MouseUp += (_, __) => Cursor = Cursors.Default; + MouseDown += (_, e) => Tag = (e.Button == MouseButtons.Left) ? (object)e.Location : null; + MouseMove += (_, e) => + { + if (e.Button == MouseButtons.Left && Tag is Point offset) + { + Cursor = Cursors.SizeAll; + var location = PointToScreen(e.Location); + location.Offset(-offset.X, -offset.Y); + Location = location; + } + }; + Paint += (_, e) => + { + var g = e.Graphics; + using (var pen = new Pen(Color.MediumPurple, 7f)) + g.DrawLine(pen, Width, 0, 0, 0); + using (var border = new Pen(Color.FromArgb(60, 0, 0, 0))) + g.DrawRectangle(border, 0, 0, Width - 1, Height - 1); + g.DrawString(Text, new Font("Consolas", 16f), Brushes.DimGray, 15, 20); + }; + btnStart.Click += (__, _) => + { + if (!running && clickType.Enabled) + { + if (int.TryParse(delayVal.Text, out int delay) && delay > -1) + { + delayVal.ReadOnly = running = true; + btnStart.Enabled = clickType.Enabled = false; + Task.Run(async () => + { + await Task.Run(async () => + { + for (int i = 1; i < waitSeconds; i++) + { + btnStart.Text = string.Format("{0}", waitSeconds - i); + await Task.Delay(1000); + } + }); + btnStart.Enabled = true; + UpdateBtnStartText(); + var downFlag = MouseEventFlag.MOUSEEVENTF_LEFTDOWN; + var upFlag = MouseEventFlag.MOUSEEVENTF_LEFTUP; + if (clickType.SelectedIndex == 1) + { + downFlag = MouseEventFlag.MOUSEEVENTF_RIGHTDOWN; + upFlag = MouseEventFlag.MOUSEEVENTF_RIGHTUP; + } + var size = Marshal.SizeOf(input); + while (running) + { + await Task.Run(async () => + { + input.mkhi.mi.dwFlags = downFlag; + SendInput(1, ref input, size); + input.mkhi.mi.dwFlags = upFlag; + SendInput(1, ref input, size); + if (delay != 0) + { + await Task.Delay(delay); + } + }); + } + if (delay == 0) + { + await Task.Delay(1000); + } + clickType.Enabled = true; + delayVal.ReadOnly = false; + UpdateBtnStartText(); + }); + } + else + { + MessageBox.Show("鼠标点击间隔,必须是等于或大于0的整数", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + else + { + running = false; + } + }; + } + + [STAThread] + public static void Main() + { + SetProcessDPIAware(); + Application.EnableVisualStyles(); + Application.Run(new MouseClickTool()); + } + } +} \ No newline at end of file diff --git a/MouseClickTool.csproj b/MouseClickTool.csproj new file mode 100644 index 0000000..c602b78 --- /dev/null +++ b/MouseClickTool.csproj @@ -0,0 +1,69 @@ + + + + + {64FA4132-AC70-4006-9495-F974EE2DD808} + WinExe + def + MouseClickTool + v4.8.1 + 512 + true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + OnOutputUpdated + true + + + x64 + obj\ + 4 + Off + none + 512 + false + true + true + false + true + AllRules.ruleset + none + False + + + + + + + + Form + + + MouseClickTool.cs + + + False + Microsoft .NET Framework 4.8.1 %28x86 和 x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + \ No newline at end of file diff --git a/MouseClickTool.jpg b/MouseClickTool.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cef442e7c10d267e2da35c90660520ed0a63682b GIT binary patch literal 26969 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%0Dr4{hoU~h@wI{zZfvEs2FBtl{(u_Mfqd+6^@ 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 D%~@sx literal 0 HcmV?d00001 diff --git a/MouseClickTool.sln b/MouseClickTool.sln new file mode 100644 index 0000000..c16b561 --- /dev/null +++ b/MouseClickTool.sln @@ -0,0 +1,21 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34408.163 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MouseClickTool", "MouseClickTool.csproj", "{64FA4132-AC70-4006-9495-F974EE2DD808}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Default|Windows = Default|Windows + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {64FA4132-AC70-4006-9495-F974EE2DD808}.Default|Windows.ActiveCfg = Default|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E084C909-99EC-4CA3-A898-31D8F2905EB7} + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md new file mode 100644 index 0000000..e5cd6b1 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# MouseClickTool + +[![Windows .exe program](https://img.shields.io/badge/windows-.exe-0078D4?logo=windows)](https://ru.wikipedia.org/wiki/.EXE) + +简单好用的鼠标连点器,因为玩游戏需要连点,在网上找了好多连点器,有的居然还要收费... + +一向穷苦的我感觉为此花钱很不值得,索性自己写了个。。。 + +最新版会记忆配置,支持设置热键,优化了性能 + +## 下载 + +[本地下载](https://github.com/lalakii/MouseClickTool/releases) | [123 云盘](https://www.123pan.com/s/jE3Sjv-IWExd.html) | [蓝奏云](https://a01.lanzout.com/b0hc64t7g) **密码:d59m** + +## 使用帮助 + +如何退出?如果鼠标点击频率过快无法停下来,请先让程序窗口到前台(ALT+TAB),然后按 ALT+F4 关闭程序。 + +如果有软件无法被点击,尝试以管理员身份运行此软件。 + +设置热键时留意是否会和其他程序冲突。 + +如果需要测试连点器速度,我知道这些网站:[点击速度测试 10 秒](https://cps-check.com/cn/) | [CPS 測試 (CPS Test) 手速測試 - 測手速](https://cpstest.org/zh/) | [CPS 测试 - 鼠标点击速度测试](https://www.arealme.com/click-speed-test/cn/) + +## 界面预览 + + + +## By lalaki.cn