今天突然想看下汇编..... 呵呵写的很原始..不过能用..算是我第一个WIN32汇编程序..纪念一下
1 .686p 2 .mmx 3 .xmm 4 .Model Flat, StdCall 5 Option Casemap :None 6 7 8 include windows.inc 9 include user32.inc 10 include kernel32.inc 11 include gdi32.inc 12 include shell32.inc 13 14 15 includelib user32.lib 16 includelib kernel32.lib 17 includelib gdi32.lib 18 includelib shell32.lib 19 20 21 22 23 ;***************************************************************************; 24 ICON equ 100 25 UM_HOOK equ ( WM_USER + 2001 ) 26 UM_ACTIVATE equ ( WM_USER + 2002 ) 27 ;***************************************************************************; 28 29 30 31 ;***************************************************************************; 32 WinMain PROTO :DWORD, :DWORD, :DWORD, :DWORD 33 WndProc PROTO :DWORD, :DWORD, :DWORD, :DWORD 34 HookProc proto :DWORD, :DWORD, :DWORD 35 InstallTrayIcon proto 36 ActiveApp proto 37 ;***************************************************************************; 38 39 40 ;***************************************************************************; 41 .const 42 szClassName db 'MouseClicker_Class', 0 43 szWndName db 'MouseClicker', 0 44 szTrayIcon db 'WM_TRAYICON', 0 45 szText db 'F3开始, F4停止. 最小化可隐藏窗口!', 0 46 szSingle db '0x437c2a59, 0x7d09, 0x4d4d, 0x83, 0x8d, 0x21, 0xe, 0x8d, 0xa3, 0xe2, 0xec', 0 47 ;***************************************************************************; 48 49 50 ;***************************************************************************; 51 .data? 52 g_hInstance dd ? 53 g_hWnd dd ? 54 g_wmTrayIcon dd ? 55 g_hHook dd ? 56 g_stNotifyIconData NOTIFYICONDATA <?> 57 g_run dd ? 58 g_hMutex dd ? 59 ;***************************************************************************; 60 61 62 .code 63 START: 64 65 ;***************************************************************************; 66 invoke CreateMutex, NULL, 0, offset szSingle 67 mov g_hMutex, eax 68 .if eax == NULL 69 invoke ExitProcess, 0 70 .endif 71 invoke GetLastError 72 .if eax == ERROR_ALREADY_EXISTS 73 invoke ActiveApp 74 invoke ExitProcess, 0 75 .endif 76 77 78 79 invoke GetModuleHandle, NULL 80 mov g_hInstance, eax 81 invoke WinMain, g_hInstance, NULL, NULL, SW_SHOWDEFAULT 82 invoke ExitProcess, 0 83 ;***************************************************************************; 84 85 86 ;***************************************************************************; 87 WinMain proc _hInst :DWORD, _hPrevInst :DWORD, _CmdLine :DWORD, _CmdShow :DWORD 88 local @wc :WNDCLASSEX 89 local @msg :MSG 90 91 mov @wc.cbSize, sizeof WNDCLASSEX 92 mov @wc.style, CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW 93 mov @wc.lpfnWndProc, offset WndProc 94 mov @wc.cbClsExtra, NULL 95 mov @wc.cbWndExtra, NULL 96 push _hInst 97 pop @wc.hInstance 98 mov @wc.hbrBackground, COLOR_BTNFACE + 1 99 mov @wc.lpszMenuName, NULL 100 mov @wc.lpszClassName, offset szClassName 101 invoke LoadIcon, _hInst, ICON 102 mov @wc.hIcon, eax 103 invoke LoadCursor, NULL, IDC_ARROW 104 mov @wc.hCursor, eax 105 mov @wc.hIconSm, 0 106 invoke RegisterClassEx, addr @wc 107 invoke CreateWindowEx, NULL, offset szClassName, offset szWndName, WS_OVERLAPPEDWINDOW and (not WS_MAXIMIZEBOX), 200, 200, 300, 100, NULL, NULL, _hInst, NULL 108 invoke ShowWindow, g_hWnd, SW_SHOWNORMAL 109 invoke UpdateWindow, g_hWnd 110 111 StartLoop: 112 invoke GetMessage, addr @msg, NULL, 0, 0 113 cmp eax, 0 114 je ExitLoop 115 invoke TranslateMessage, addr @msg 116 invoke DispatchMessage, addr @msg 117 jmp StartLoop 118 ExitLoop: 119 120 mov eax, @msg.wParam 121 ret 122 WinMain endp 123 ;***************************************************************************; 124 125 126 ;***************************************************************************; 127 WndProc proc _hWnd :DWORD, _uMsg :DWORD, _wParam :DWORD, _lParam :DWORD 128 local @stPs:PAINTSTRUCT 129 ;local @stRect:RECT 130 local @hDc 131 mov eax, _uMsg 132 ;***************************************************************************; 133 .if eax == WM_CREATE 134 push _hWnd 135 pop g_hWnd 136 mov g_run, 0 137 invoke SetProp, _hWnd, offset szSingle, 1 138 invoke InstallTrayIcon 139 .if eax != 0 140 invoke SetWindowsHookEx, WH_KEYBOARD_LL, HookProc, g_hInstance, 0 141 .if eax != 0 142 mov g_hHook, eax 143 ret 144 .else 145 mov g_stNotifyIconData.uFlags, 0 146 invoke Shell_NotifyIcon, NIM_DELETE, offset g_stNotifyIconData 147 .endif 148 .endif 149 invoke PostQuitMessage, NULL 150 ;***************************************************************************; 151 .elseif eax == WM_DESTROY 152 invoke PostQuitMessage, NULL 153 ;***************************************************************************; 154 .elseif eax == WM_CLOSE 155 invoke UnhookWindowsHookEx, g_hHook 156 invoke KillTimer, _hWnd, 1 157 mov g_stNotifyIconData.uFlags, 0 158 invoke Shell_NotifyIcon, NIM_DELETE, offset g_stNotifyIconData 159 invoke RemoveProp, _hWnd, offset szSingle 160 invoke CloseHandle, g_hMutex 161 invoke DestroyWindow, _hWnd 162 ;***************************************************************************; 163 .elseif eax == WM_PAINT 164 invoke BeginPaint, _hWnd, addr @stPs 165 mov @hDc, eax 166 invoke SetBkMode, @hDc, TRANSPARENT 167 ;invoke GetClientRect, _hWnd, addr @stRect 168 ;invoke DrawText, @hDc, offset szText, -1, addr @stRect, DT_SINGLELINE or DT_CENTER or DT_VCENTER 169 invoke TextOut, @hDc, 30, 25, offset szText, 33 170 invoke EndPaint, _hWnd, addr @stPs 171 ;***************************************************************************; 172 .elseif eax == WM_SYSCOMMAND && _wParam == SC_MINIMIZE 173 invoke ShowWindow, _hWnd, SW_HIDE 174 ;***************************************************************************; 175 .elseif eax == WM_TIMER 176 invoke mouse_event, MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 177 invoke mouse_event, MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 178 ;***************************************************************************; 179 .elseif eax == g_wmTrayIcon 180 and _lParam, 0FFFFh 181 .if _lParam == WM_LBUTTONDBLCLK 182 invoke IsIconic, _hWnd 183 .if eax != 0 184 invoke ShowWindow, _hWnd, SW_RESTORE 185 .else 186 invoke IsWindowVisible, _hWnd 187 .if eax != 0 188 invoke ShowWindow, _hWnd, SW_HIDE 189 .else 190 invoke ShowWindow, _hWnd, SW_SHOW 191 invoke BringWindowToTop, _hWnd 192 invoke SetForegroundWindow, _hWnd 193 .endif 194 .endif 195 .endif 196 ;***************************************************************************; 197 .elseif eax == UM_ACTIVATE 198 invoke IsIconic, _hWnd 199 .if eax != 0 200 invoke ShowWindow, _hWnd, SW_RESTORE 201 .else 202 invoke IsWindowVisible, _hWnd 203 .if eax == 0 204 invoke ShowWindow, _hWnd, SW_SHOW 205 invoke BringWindowToTop, _hWnd 206 invoke SetForegroundWindow, _hWnd 207 .endif 208 .endif 209 ;***************************************************************************; 210 .elseif eax == UM_HOOK 211 mov esi, _lParam 212 assume esi : ptr KBDLLHOOKSTRUCT 213 .if [esi].vkCode == VK_F3 214 .if g_run == 0 215 mov g_run, 1 216 invoke SetTimer, _hWnd, 1, 99, NULL 217 .endif 218 .elseif [esi].vkCode == VK_F4 219 .if g_run == 1 220 invoke KillTimer, _hWnd, 1 221 mov g_run, 0 222 .endif 223 .endif 224 assume esi : nothing 225 ;***************************************************************************; 226 .else 227 invoke DefWindowProc, _hWnd, _uMsg, _wParam, _lParam 228 ;***************************************************************************; 229 .endif 230 ret 231 WndProc endp 232 ;***************************************************************************; 233 234 235 236 ;***************************************************************************; 237 HookProc proc _nCode, _wParam, _lParam 238 invoke CallNextHookEx, g_hHook, _nCode, _wParam, _lParam 239 push eax 240 .if _nCode == HC_ACTION && _wParam == WM_KEYUP 241 invoke SendMessage, g_hWnd, UM_HOOK, _wParam, _lParam 242 .endif 243 pop eax 244 ret 245 HookProc endp 246 ;***************************************************************************; 247 248 249 ;***************************************************************************; 250 InstallTrayIcon proc 251 local @dwIcon :DWORD 252 invoke RtlZeroMemory, offset g_stNotifyIconData, sizeof g_stNotifyIconData 253 mov g_stNotifyIconData.cbSize, sizeof g_stNotifyIconData 254 mov g_stNotifyIconData.uFlags, NIF_MESSAGE or NIF_ICON 255 push g_hWnd 256 pop g_stNotifyIconData.hwnd 257 invoke RegisterWindowMessage, offset szTrayIcon 258 .if eax != 0 259 mov g_stNotifyIconData.uCallbackMessage, eax 260 mov g_wmTrayIcon, eax 261 invoke GetSystemMetrics, SM_CXSMICON 262 mov @dwIcon, eax 263 invoke LoadImage, g_hInstance, ICON, IMAGE_ICON, @dwIcon, @dwIcon, LR_DEFAULTCOLOR 264 .if eax != 0 265 mov g_stNotifyIconData.hIcon, eax 266 invoke Shell_NotifyIcon, NIM_ADD, offset g_stNotifyIconData 267 .endif 268 .endif 269 ret 270 InstallTrayIcon endp 271 ;***************************************************************************; 272 273 274 ;***************************************************************************; 275 ActiveApp proc 276 local @hWndPre :DWORD 277 invoke GetDesktopWindow 278 invoke GetWindow, eax, GW_CHILD 279 mov @hWndPre, eax 280 invoke IsWindow, eax 281 .while eax != 0 282 invoke GetProp, @hWndPre, offset szSingle 283 .if eax != 0 284 invoke PostMessage, @hWndPre, UM_ACTIVATE, 0, 0 285 .break 286 .endif 287 invoke GetWindow, @hWndPre, GW_HWNDNEXT 288 mov @hWndPre, eax 289 invoke IsWindow, eax 290 .endw 291 ret 292 ActiveApp endp 293 ;***************************************************************************; 294 295 END START