Advertisement
Guest User

Untitled

a guest
Dec 31st, 2010
954
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.04 KB | None | 0 0
  1. #include "AutoClicker.h"
  2.  
  3. HWND  hwndTarget   = NULL;
  4. DWORD PMX          = ( DWORD )GetProcAddress( LoadLibrary( _T("user32.dll") ), "PostMessageW" ) + 5;
  5. bool  bUsingPMX    = true;
  6. UINT  nMessageDown = WM_LBUTTONDOWN;
  7. UINT  nMessageUp   = WM_LBUTTONUP;
  8. int   nCurrent     = 0;
  9. int   nStop        = 0;
  10.  
  11. _declspec( naked ) BOOL WINAPI PostMessageX(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
  12.   __asm {
  13.       push ebp
  14.       mov ebp,esp
  15.       jmp [PMX]
  16.   }
  17. }
  18.  
  19. // used instead of BM_CLICK to allow background activation
  20. void ToggleCheck( HWND hwndDlg, int nIDDlgItem ) {
  21.   HWND hwndButton = GetDlgItem( hwndDlg, nIDDlgItem );
  22.  
  23.   if( IsWindowEnabled( hwndButton ) ) {
  24.     Button_SetCheck( hwndButton,
  25.         Button_GetState( hwndButton ) == BST_CHECKED ? BST_UNCHECKED : BST_CHECKED );
  26.     SendMessage( hwndDlg, WM_COMMAND, MAKEWPARAM( nIDDlgItem, NULL ), ( LPARAM )hwndButton );
  27.   }
  28. }
  29.  
  30. void RestoreDefaults( HWND hwndDlg ) {
  31.   SetDlgItemInt( hwndDlg, IDC_INTERVAL, MINIMUM_INTERVAL, false );
  32.   SetDlgItemInt( hwndDlg, IDC_STOPAFTER, DEFAULT_STOPAFTER, false );
  33. }
  34.  
  35. void NewTarget( HWND hwndDlg ) {
  36.   TCHAR lpToggleText[32] = {0};
  37.  
  38.   GetDlgItemText( hwndDlg, IDC_TOGGLE, lpToggleText, _countof( lpToggleText ) );
  39.              
  40.   // stop if AC is running
  41.   if( _tcscmp( lpToggleText, _T("Stop (F12)") ) == 0 ) {
  42.     ToggleCheck( hwndDlg, IDC_TOGGLE );
  43.   }
  44.  
  45.   EnableWindow( GetDlgItem( hwndDlg, IDC_INTERVAL ), false );
  46.   EnableWindow( GetDlgItem( hwndDlg, IDC_STOPAFTER ), false );
  47.   EnableWindow( GetDlgItem( hwndDlg, IDC_TOGGLE ), false );
  48.   EnableWindow( GetDlgItem( hwndDlg, IDC_LEFT ), false );
  49.   EnableWindow( GetDlgItem( hwndDlg, IDC_RIGHT ), false );
  50.   EnableWindow( GetDlgItem( hwndDlg, IDC_POSTMESSAGE ), false );
  51.   EnableWindow( GetDlgItem( hwndDlg, IDC_MOUSEEVENT ), false );
  52.   EnableWindow( GetDlgItem( hwndDlg, IDC_WINDOWNAME ), true );
  53.   EnableWindow( GetDlgItem( hwndDlg, IDC_CLASSNAME ), true );
  54.   EnableWindow( GetDlgItem( hwndDlg, IDC_ENUMERATE ), true );
  55.  
  56.   SetDlgItemText( hwndDlg, IDC_WINDOWNAME, _T("") );
  57.   SetDlgItemText( hwndDlg, IDC_CLASSNAME, _T("") );
  58.   SetDlgItemText( hwndDlg, IDC_SELECT, _T("Select") );
  59.   hwndTarget = NULL;
  60. }
  61.  
  62. INT_PTR CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
  63.   switch( uMsg ) {
  64.     case WM_INITDIALOG: {
  65.       int  parts[] = {50, 0, -1};
  66.       RECT rect    = {0};
  67.  
  68.       SetWindowLong( hwndDlg, GWL_EXSTYLE, GetWindowLong( hwndDlg, GWL_EXSTYLE ) | WS_EX_LAYERED );
  69.       SetLayeredWindowAttributes( hwndDlg, NULL, 230, LWA_ALPHA );
  70.  
  71.       SendDlgItemMessage( hwndDlg, IDC_STATUSBAR, SB_GETRECT, 0, ( LPARAM )&rect );
  72.       parts[1] = ( rect.right - parts[0] ) / 2 + parts[0];
  73.       SendDlgItemMessage( hwndDlg, IDC_STATUSBAR, SB_SETPARTS, 3, ( LPARAM )parts );
  74.       SendDlgItemMessage( hwndDlg, IDC_STATUSBAR, SB_SETTEXT,
  75.           MAKEWPARAM( 0, 0 ), ( LPARAM )_T("Idle") );
  76.  
  77.       RestoreDefaults( hwndDlg );
  78.  
  79.       SetTimer( hwndDlg, TOGGLE_HOTKEY_TIMER, 100, NULL );
  80.       SetTimer( hwndDlg, SHOW_MOUSE_COORDS, 50, NULL );
  81.       SetTimer( hwndDlg, GET_TARGET_TIMER, 100, NULL );
  82.  
  83.       ToggleCheck( hwndDlg, IDC_FOREGROUND );
  84.       break;
  85.     }
  86.     case WM_TIMER: {
  87.       switch( wParam ) {
  88.         case TOGGLE_HOTKEY_TIMER:
  89.           if( GetAsyncKeyState( VK_F12 ) != 0 ) {
  90.             ToggleCheck( hwndDlg, IDC_TOGGLE );
  91.           }
  92.  
  93.           break;
  94.         case SHOW_MOUSE_COORDS: {
  95.           POINT pt          = {0};
  96.  
  97.           GetCursorPos( &pt );
  98.           SetDlgItemInt( hwndDlg, IDC_XCOORD, pt.x, false );
  99.           SetDlgItemInt( hwndDlg, IDC_YCOORD, pt.y, false );
  100.           break;
  101.         }
  102.         case CLICKING_TIMER: {
  103.           SetDlgItemInt( hwndDlg, IDC_CURRENT, nCurrent, false );
  104.  
  105.           if( nCurrent == -1 ) {
  106.             break;
  107.           } else if( nCurrent == nStop && nStop != 0 ) {
  108.             nCurrent = -1;
  109.             ToggleCheck( hwndDlg, IDC_TOGGLE );
  110.           } else {
  111.             POINT pt = {0};
  112.  
  113.             GetCursorPos( &pt );
  114.  
  115.             if( bUsingPMX ) {
  116.               ScreenToClient( hwndTarget, &pt );
  117.  
  118.               PostMessageX( hwndTarget, nMessageDown, NULL, MAKELPARAM( pt.x, pt.y ) );
  119.               PostMessageX( hwndTarget, nMessageUp, NULL, MAKELPARAM( pt.x, pt.y ) );
  120.             } else {
  121.               mouse_event( MOUSEEVENTF_ABSOLUTE |
  122.                   ( nMessageDown == WM_LBUTTONDOWN ? ( MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP ) : ( MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP ) ),
  123.                   pt.x, pt.y, NULL, NULL );
  124.             }
  125.             nCurrent++;
  126.           }
  127.  
  128.           break;
  129.         }
  130.         case GET_TARGET_TIMER: {
  131.           TCHAR lpSelect[32] = {0};
  132.           GetDlgItemText( hwndDlg, IDC_SELECT, lpSelect, _countof( lpSelect ) );
  133.  
  134.           if( _tcscmp( lpSelect, _T("Select") ) != 0 ) {
  135.             // AC is locked onto a window already
  136.             // if locked window no longer exists
  137.             if( !IsWindow( hwndTarget ) ) {
  138.               NewTarget( hwndDlg );
  139.             }
  140.           } else {
  141.             TCHAR lpClassName[64]  = {0};
  142.             TCHAR lpWindowName[64] = {0};
  143.             BOOL  bClassName, bWindowName;
  144.  
  145.             bClassName  = GetDlgItemText( hwndDlg, IDC_CLASSNAME,
  146.                 lpClassName, _countof( lpClassName ) ) != 0;
  147.             bWindowName = GetDlgItemText( hwndDlg, IDC_WINDOWNAME,
  148.                 lpWindowName, _countof( lpClassName ) ) != 0;
  149.  
  150.             if( !bWindowName && !bClassName ) {
  151.               hwndTarget = NULL;
  152.             } else {
  153.               hwndTarget = FindWindow( bClassName ? lpClassName : NULL,
  154.                   bWindowName ? lpWindowName : NULL );
  155.             }
  156.           }
  157.  
  158.           if( hwndTarget == NULL ) {
  159.             SetDlgItemText( hwndDlg, IDC_WINDOWHANDLE, _T("No Matching Window") );
  160.             EnableWindow( GetDlgItem( hwndDlg, IDC_SELECT ), false );
  161.           } else {
  162.             TCHAR lpCurrentHandle[64] = {0};
  163.  
  164.             _stprintf_s( lpCurrentHandle, _countof( lpCurrentHandle ), _T("0x%08X"), hwndTarget );
  165.             SetDlgItemText( hwndDlg, IDC_WINDOWHANDLE, lpCurrentHandle );
  166.             EnableWindow( GetDlgItem( hwndDlg, IDC_SELECT ), true );
  167.           }
  168.  
  169.           break;
  170.         }
  171.         default:
  172.           return false;
  173.       }
  174.  
  175.       break;
  176.     }
  177.  
  178.     case WM_COMMAND: {
  179.       switch( LOWORD( wParam ) ) {
  180.         case IDC_TOGGLE: {
  181.           bool bChecked = IsDlgButtonChecked( hwndDlg, IDC_TOGGLE ) == BST_CHECKED;
  182.  
  183.           Button_SetText( GetDlgItem( hwndDlg, IDC_TOGGLE ),
  184.               !bChecked ? _T("Start (F12)") : _T("Stop (F12)") );
  185.           SendDlgItemMessage( hwndDlg, IDC_STATUSBAR, SB_SETTEXT,
  186.               0, (LPARAM)( bChecked ? _T("Active") : _T("Idle") ) );
  187.           EnableWindow( GetDlgItem( hwndDlg, IDC_INTERVAL ), !bChecked );
  188.           EnableWindow( GetDlgItem( hwndDlg, IDC_STOPAFTER ), !bChecked );
  189.           EnableWindow( GetDlgItem( hwndDlg, IDC_LEFT ), !bChecked );
  190.           EnableWindow( GetDlgItem( hwndDlg, IDC_RIGHT ), !bChecked );
  191.           EnableWindow( GetDlgItem( hwndDlg, IDC_POSTMESSAGE ), !bChecked );
  192.           EnableWindow( GetDlgItem( hwndDlg, IDC_MOUSEEVENT ), !bChecked );
  193.  
  194.           if( bChecked ) {
  195.             nCurrent = 0;
  196.             nStop    = GetDlgItemInt( hwndDlg, IDC_STOPAFTER, NULL, false );
  197.             SetTimer( hwndDlg, CLICKING_TIMER,
  198.                 GetDlgItemInt( hwndDlg, IDC_INTERVAL, NULL, false ), NULL );
  199.           } else {
  200.             KillTimer( hwndDlg, CLICKING_TIMER );
  201.           }
  202.  
  203.           break;
  204.         }
  205.         case IDC_FOREGROUND: {
  206.           UINT iChecked = IsDlgButtonChecked( hwndDlg, IDC_FOREGROUND );
  207.           SetWindowPos( hwndDlg, iChecked == BST_CHECKED ? HWND_TOPMOST : HWND_NOTOPMOST,
  208.               0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  209.           break;
  210.         }
  211.         case IDC_INTERVAL: {
  212.           switch( HIWORD( wParam ) ) {
  213.             case EN_UPDATE: {
  214.               BOOL bTranslated;
  215.               BOOL bValidStop = SendDlgItemMessage( hwndDlg, IDC_STATUSBAR, SB_GETTEXTLENGTH, 2, 0 ) == 0;
  216.               UINT nInterval  = GetDlgItemInt( hwndDlg, IDC_INTERVAL, &bTranslated, false );
  217.               HWND hwndToggle = GetDlgItem( hwndDlg, IDC_TOGGLE );
  218.  
  219.               if( !bTranslated || nInterval < MINIMUM_INTERVAL ) {
  220.                 SendDlgItemMessage( hwndDlg, IDC_STATUSBAR, SB_SETTEXT,
  221.                     1, ( LPARAM )_T("Interval must be >= 10ms") );
  222.                 EnableWindow( hwndToggle, false );
  223.               } else {
  224.                 SendDlgItemMessage( hwndDlg, IDC_STATUSBAR, SB_SETTEXT,
  225.                     1, ( LPARAM )_T("") );
  226.  
  227.                 if( IsWindowEnabled( ( HWND )lParam ) ) {
  228.                   EnableWindow( hwndToggle, true && bValidStop );
  229.                 }
  230.               }
  231.  
  232.               break;
  233.             }
  234.             default:
  235.               return false;
  236.           }
  237.  
  238.           break;
  239.         }
  240.         case IDC_STOPAFTER: {
  241.           switch( HIWORD( wParam ) ) {
  242.             case EN_UPDATE: {
  243.               BOOL bTranslated;
  244.               BOOL bValidInterval = SendDlgItemMessage( hwndDlg, IDC_STATUSBAR, SB_GETTEXTLENGTH, 1, 0 ) == 0;
  245.               UINT nStopAfter     = GetDlgItemInt( hwndDlg, IDC_STOPAFTER, &bTranslated, false );
  246.               HWND hwndToggle     = GetDlgItem( hwndDlg, IDC_TOGGLE );
  247.  
  248.               if( !bTranslated ) {
  249.                 SendDlgItemMessage( hwndDlg, IDC_STATUSBAR, SB_SETTEXT,
  250.                     2, ( LPARAM )_T("Stop after can not be blank") );
  251.                 EnableWindow( hwndToggle, false );
  252.               } else {
  253.                 SendDlgItemMessage( hwndDlg, IDC_STATUSBAR, SB_SETTEXT,
  254.                     2, ( LPARAM )_T("") );
  255.  
  256.                 if( IsWindowEnabled( ( HWND )lParam ) ) {
  257.                   EnableWindow( hwndToggle, true && bValidInterval );
  258.                 }
  259.               }
  260.  
  261.               break;
  262.             }
  263.             default:
  264.               return false;
  265.           }
  266.  
  267.           break;
  268.         }
  269.         case IDC_LEFT:
  270.           nMessageDown = WM_LBUTTONDOWN;
  271.           nMessageUp   = WM_LBUTTONUP;
  272.           break;
  273.         case IDC_RIGHT:
  274.           nMessageDown = WM_RBUTTONDOWN;
  275.           nMessageUp   = WM_RBUTTONUP;
  276.           break;
  277.         case IDC_SELECT: {
  278.           TCHAR lpSelect[16] = {0};
  279.  
  280.           GetDlgItemText( hwndDlg, IDC_SELECT, lpSelect, _countof( lpSelect ) );
  281.  
  282.           if( _tcscmp( lpSelect, _T("Select") ) == 0 ) {
  283.             SetDlgItemText( hwndDlg, IDC_SELECT, _T("New Target") );
  284.             RestoreDefaults( hwndDlg );
  285.  
  286.             EnableWindow( GetDlgItem( hwndDlg, IDC_INTERVAL ), true );
  287.             EnableWindow( GetDlgItem( hwndDlg, IDC_STOPAFTER ), true );
  288.             EnableWindow( GetDlgItem( hwndDlg, IDC_TOGGLE ), true );
  289.             EnableWindow( GetDlgItem( hwndDlg, IDC_LEFT ), true );
  290.             EnableWindow( GetDlgItem( hwndDlg, IDC_RIGHT ), true );
  291.             EnableWindow( GetDlgItem( hwndDlg, IDC_POSTMESSAGE ), true );
  292.             EnableWindow( GetDlgItem( hwndDlg, IDC_MOUSEEVENT ), true );
  293.             EnableWindow( GetDlgItem( hwndDlg, IDC_WINDOWNAME ), false );
  294.             EnableWindow( GetDlgItem( hwndDlg, IDC_CLASSNAME ), false );
  295.             EnableWindow( GetDlgItem( hwndDlg, IDC_ENUMERATE ), false );
  296.  
  297.             ToggleCheck( hwndDlg, IDC_LEFT );
  298.             ToggleCheck( hwndDlg, IDC_POSTMESSAGE );
  299.           } else {
  300.             NewTarget( hwndDlg );
  301.           }
  302.  
  303.           break;
  304.         }
  305.         case IDC_POSTMESSAGE:
  306.           bUsingPMX = true;
  307.           break;
  308.         case IDC_MOUSEEVENT:
  309.           bUsingPMX = false;
  310.           break;
  311.         case IDC_ENUMERATE: {
  312.           hwndTarget = ( HWND )DialogBox( GetModuleHandle( NULL ),
  313.               MAKEINTRESOURCE( IDD_ENUMERATION ), hwndDlg, WindowEnumProc );
  314.  
  315.           if( hwndTarget != NULL ) {
  316.             EnableWindow( GetDlgItem( hwndDlg, IDC_SELECT ), true );
  317.             ToggleCheck( hwndDlg, IDC_SELECT );
  318.             EnableWindow( GetDlgItem( hwndDlg, IDC_ENUMERATE ), false );
  319.           }
  320.           break;
  321.         }
  322.         default:
  323.           return false;
  324.         }
  325.  
  326.       break;
  327.     }
  328.  
  329.     case WM_CLOSE:
  330.       KillTimer( hwndDlg, SHOW_MOUSE_COORDS );
  331.       KillTimer( hwndDlg, TOGGLE_HOTKEY_TIMER );
  332.       KillTimer( hwndDlg, GET_TARGET_TIMER );
  333.       EndDialog( hwndDlg, 0 );
  334.       break;
  335.  
  336.     default:
  337.       return false;
  338.   }
  339.  
  340.   return true;
  341. }
  342.  
  343. int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) {
  344.   INITCOMMONCONTROLSEX iccex = {0};
  345.   iccex.dwSize               = sizeof iccex;
  346.   iccex.dwICC                = ICC_WIN95_CLASSES | ICC_STANDARD_CLASSES | ICC_BAR_CLASSES;
  347.  
  348.   if( !InitCommonControlsEx( &iccex ) ) {
  349.     MessageBox( NULL, _T("Error registering classes from comctl32.lib"), NULL, MB_OK );
  350.     return -1;
  351.   }
  352.  
  353.   hwndTarget = FindWindow( _T("Minesweeper"), _T("Minesweeper") );
  354.  
  355.   if( DialogBox( hInstance, MAKEINTRESOURCE( IDD_DIALOG ), NULL, DialogProc ) == -1 ) {
  356.     MessageBox( NULL, _T("Problem initialising window"), NULL, MB_OK );
  357.     return -1;
  358.   }
  359.  
  360.   return ERROR_SUCCESS;
  361. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement