查看: 1329|回复: 2

[C++资源] 完整版的鼠标连点器(修改版)

[复制链接]
发表于 2023-11-6 18:44 | 显示全部楼层 |阅读模式
非法程序、 2023-11-6 18:44 1329 2 显示全部楼层
上次发的鼠标连点器实现源码,利用Sleep函数延时。根据  TinaZerotwo  的说法,Sleep()函数来等待按键事件,这会导致线程被阻塞,无法响应其他事件。更好的方式是使用消息循环或事件驱动的机制来监听键盘事件。于是我修改了一下,利用系统自带的timer实现定时触发。因为timer需要有界面支持,所以自己做了一个简单的界面。

源码和可执行文件都放在打包文件里,可以自行编译,也可以自行修改以实现自己的目的。

源码也贴在这里:
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <stdio.h>

  4. using namespace std;

  5. #define IDT_TIMER1 1

  6. LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ;

  7. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
  8. {
  9.         static TCHAR szAppName[] = TEXT( "demo" ) ;
  10.         HWND        hwnd ;
  11.         MSG            msg ;
  12.         WNDCLASS    wndclass ;

  13.         wndclass.lpfnWndProc    = WndProc ;
  14.         wndclass.style            = CS_HREDRAW | CS_VREDRAW ;
  15.         wndclass.hInstance        = hInstance ;
  16.         wndclass.cbClsExtra        = 0 ;
  17.         wndclass.cbWndExtra        = 0 ;
  18.         wndclass.hbrBackground    = (HBRUSH) GetStockObject(WHITE_BRUSH) ;
  19.         wndclass.hCursor        = LoadCursor( NULL, IDC_ARROW ) ;
  20.         wndclass.hIcon            = LoadIcon( NULL, IDI_APPLICATION ) ;
  21.         wndclass.lpszClassName    = szAppName ;
  22.         wndclass.lpszMenuName    = NULL ;
  23.       
  24.         if( !RegisterClass(&wndclass) )
  25.         {
  26.                 MessageBox( NULL, TEXT("无法注册窗口类!"), TEXT("错误"), MB_OK | MB_ICONERROR ) ;
  27.                 return 0 ;
  28.         }

  29.         hwnd = CreateWindow( szAppName, TEXT("test"), WS_OVERLAPPEDWINDOW,
  30.                         CW_USEDEFAULT, CW_USEDEFAULT,
  31.                         CW_USEDEFAULT, CW_USEDEFAULT,
  32.                         NULL, NULL, hInstance, NULL ) ;

  33.         ShowWindow( hwnd, iCmdShow ) ;
  34.         UpdateWindow( hwnd ) ;

  35.         while( GetMessage(&msg, NULL, 0, 0) )
  36.         {
  37.                 TranslateMessage( &msg ) ;
  38.                 DispatchMessage( &msg ) ;
  39.         }

  40.         return msg.wParam ;
  41. }

  42. LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
  43. {
  44.   static HWND btn,btn2;
  45.   static POINT p;
  46.   static HWND hdc;

  47.         switch( message )
  48.         {
  49.         case WM_CREATE:
  50.     btn = CreateWindow( TEXT("button"), TEXT("开始点击"),
  51.                                 WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
  52.                                 20, 20, 120, 20,
  53.                                 hwnd, (HMENU)3, ((LPCREATESTRUCT) lParam) -> hInstance, NULL ) ;
  54.                 return 0 ;
  55.         case WM_COMMAND:
  56.                 switch(LOWORD(wParam))
  57.                 {
  58.                 case 3:
  59.                         switch(HIWORD(wParam))
  60.                         {
  61.                                 case BN_CLICKED:
  62.           MessageBox( NULL, TEXT("将鼠标置于需要连续点击的位置,按下UP键开始鼠标连续点击。DOWN键结束本次点击。"), TEXT("提示信息!"), MB_OK | MB_ICONERROR ) ;
  63.           while(!(GetAsyncKeyState(VK_UP) & 0x8000)){
  64.             Sleep(20);
  65.           }
  66.           GetCursorPos(&p);
  67.           hdc = WindowFromPoint(p);
  68.           ScreenToClient(hdc, &p);
  69.           SetTimer(hwnd,IDT_TIMER1,10,(TIMERPROC)NULL);
  70.                                         break ;
  71.                         }
  72.                         break ;
  73.                 }
  74.                 return 0 ;
  75.         case WM_TIMER:
  76.                 switch (wParam)
  77.                 {
  78.                         case IDT_TIMER1:
  79.                                 SendMessage(hdc,WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(p.x,p.y));
  80.         SendMessage(hdc,WM_LBUTTONUP,MK_LBUTTON,MAKELONG(p.x,p.y));
  81.         if(GetAsyncKeyState(VK_DOWN) & 0x8000){
  82.           KillTimer(hwnd,IDT_TIMER1);
  83.         }
  84.                                 break;
  85.                 }
  86.                 return 0 ;
  87.         case WM_DESTROY:
  88.                 KillTimer(hwnd,IDT_TIMER1);
  89.                 PostQuitMessage(0) ;
  90.                 return 0 ;
  91.         }

  92.         return DefWindowProc( hwnd, message, wParam, lParam ) ;
  93. }
复制代码


click.zip

21.17 KB, 下载次数: 63, 下载积分: 牛币 -2 个

发表于 2023-11-7 03:01 | 显示全部楼层
老挂比 2023-11-7 03:01 显示全部楼层
老好用了谢谢!
回复

使用道具 举报

发表于 2024-1-19 19:43 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

快速回复 返回顶部 返回列表