RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 997318
Accepted
LORD
LORD
Asked:2020-06-28 15:54:20 +0000 UTC2020-06-28 15:54:20 +0000 UTC 2020-06-28 15:54:20 +0000 UTC

如何在按键C#上停止线程

  • 772

有一个线程可以模拟鼠标点击,在鼠标点击之间,这个线程将冻结(Thread.Sleep())。有一些想法可以通过按下按钮来停止线程,例如 Escape

    public Form1()
    {
        InitializeComponent();
        Thread myThread = new Thread(Thr);
        myThread.Start();
    }


    private static void Thr()
    {
        while (true)
        {
            Thread.Sleep(300);
            Click(323, 454);
        }
    }
c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    LORD
    2020-06-30T00:45:58Z2020-06-30T00:45:58Z

    简单介绍一下我的拐杖代码,在表单加载中初始化了转义钩子,然后第一次单击该钩子,创建了一个 CancellationToken,并启动了一个单击的任务,第二次单击了转义符,它检查是否令牌是否存在以及是否有取消请求,如果条件为 true ,则关闭令牌和第二个线程。我非常确定我写错了,我很乐意发表评论

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace AutoBrute
    {
        public partial class Form1 : Form
        {
    
            CancellationTokenSource cancelTokenSource;
            static CancellationToken token;
            private Hook _hook;
    
    
    
            [DllImport("user32.dll")]
            static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
    
    
            [DllImport("user32.dll")]//загружает метод для клика из win api
            public static extern long mouse_event(int dsFlags, int dx, int dy, int cByttons, int dsExtraInfo);
    
            [DllImport("user32.dll")]//перемещает указатель мыши
            public static extern long SetCursorPos(int x, int y);
    
    
            public Form1()
            {
                InitializeComponent();
            }
    
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
    
                //установка глобальных хуков клавиатуры
                keybd_event(0x90, 0x45, 0x1, (UIntPtr)0);
    
                _hook = new Hook(27); //Передаем код клавиши на которую ставим хук, тут это Escape
                _hook.KeyPressed += new KeyPressEventHandler(_hook_KeyPressedEscape);
                _hook.SetHook();
    
    
            }
    
    
    
            void _hook_KeyPressedEscape(object sender, KeyPressEventArgs e) //Событие нажатия клавиши Escape
            {
                if(cancelTokenSource?.IsCancellationRequested==false)
                {
    
                    cancelTokenSource.Cancel();
                    cancelTokenSource = null;
                }
                else
                {
                    //токены для остановки потока который будет кликать
                    cancelTokenSource = new CancellationTokenSource();
                    token = cancelTokenSource.Token;
    
                    Task a = new Task(Clicks);
                    a.Start();
                }        }
    
    
            private void Clicks()
            {
                while (true)
                {
                    if (token.IsCancellationRequested)
                    {
                        return;
                    }
    
                    Random r = new Random();
                    int WidthMax = 1280;
                    int HeightMax = 1024;
    
    
                    mouse_event(2, r.Next(WidthMax), r.Next(HeightMax),0,0);
                    mouse_event(4, r.Next(WidthMax), r.Next(HeightMax),0,0);
    
                    Thread.Sleep(400);
                }
            }
    
    
    
    
    
        }
    }
    

    好吧,使用钩子的类本身

     public class Hook : IDisposable
        {
            #region Declare WinAPI functions
            [DllImport("kernel32.dll")]
            private static extern IntPtr LoadLibrary(string lpFileName);
    
            [DllImport("user32.dll")]
            private static extern IntPtr SetWindowsHookEx(int idHook, KeyboardHookProc callback, IntPtr hInstance, uint threadId);
            [DllImport("user32.dll")]
            private static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);
            [DllImport("user32.dll")]
            private static extern bool UnhookWindowsHookEx(IntPtr hInstance);
            #endregion
            #region Constants
            private const int WH_KEYBOARD_LL = 13;
            private const int WH_KEYDOWN = 0x0100;
            #endregion
    
            // код клавиши на которую ставим хук
            public int _key;
            public event KeyPressEventHandler KeyPressed;
    
            private delegate IntPtr KeyboardHookProc(int code, IntPtr wParam, IntPtr lParam);
            private KeyboardHookProc _proc;
            private IntPtr _hHook = IntPtr.Zero;
    
            public Hook(int keyCode)
            {
                _key = keyCode;
                _proc = HookProc;
            }
    
            public void SetHook()
            {
                var hInstance = LoadLibrary("User32");
                _hHook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
            }
    
            public void Dispose()
            {
                UnHook();
            }
    
            public void UnHook()
            {
                UnhookWindowsHookEx(_hHook);
            }
    
            private IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam)
            {
                if ((code >= 0 && wParam == (IntPtr)WH_KEYDOWN) && Marshal.ReadInt32(lParam) == _key)
                {
    
                    // бросаем событие
                    if (KeyPressed != null)
                    {
                        KeyPressed(this, new KeyPressEventArgs(Convert.ToChar(code)));
                    }
                }
    
                // пробрасываем хук дальше
                return CallNextHookEx(_hHook, code, (int)wParam, lParam);
            }
        }
    
    • 0
  2. LiptonDev
    2020-06-28T19:00:34Z2020-06-28T19:00:34Z

    使用键盘挂钩来按下按键。

    此外,要在捕获所需键后终止线程,您可以简单地使用将在您的 while 循环中使用的 bool 变量,它看起来像这样:

    bool cancelThread = false;
    
    public Form1()
    {
        InitializeComponent();
        Thread myThread = new Thread(Thr);
        myThread.Start();
    }
    
    
    void Thr()
    {
        while (!cancelThread)
        {
            Thread.Sleep(300);
            Click(323, 454);
        }
    }
    

    在捕获的关键事件中,将 cancelThread 变量设置为 true,循环将结束,线程也随之结束。

    但是我给你的建议是,阅读async/await

    • -2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5