在汇编通讯上看了一篇关于在Notepad上写字的程序,感觉很有趣,于是把程序改进了下。程序首先是利用FindWindow()函数来寻找Notepad的句柄,用SetTimer()每秒触发一次绘图事件,在强制打开的记事本上绘字,具体截图如下:
功能都是在控制台下实现的,方便与测试。实验的源代码如下:
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ;#Mode = CON .386 .model flat, stdcall option casemap: none ;------------------------------------------------------------------ include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include gdi32.inc includelib gdi32.lib include masm32.inc includelib masm32.lib include macro.asm ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< .data? stMsg MSG <> idTimer dd ? iCount dd ? buffer db 100 dup(?) .const szCmdLine db "c:/windows/notepad.exe",0 szNotePadClass db "notepad",0 szNoFound db "%d Can't find a notepad!", 0dh, 0ah, 0 szDrawText db "Powered By Win32 Assembly!",0 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< .code _ProcTimer proc local @hNotePad, @hDC, @hFont local @stRect:RECT ;==============================找到记事本句柄 invoke FindWindow,addr szNotePadClass,NULL .if eax == 0 invoke wsprintf,addr buffer,addr szNoFound,iCount invoke StdOut,addr buffer inc iCount ret .endif mov @hNotePad,eax invoke GetDC,eax mov @hDC,eax ;=============================生成绘图的字体 invoke CreateFont,/ 40, 16, 0, 0,/ FW_BLACK, 0, 0, 0,/ ANSI_CHARSET,/ OUT_DEFAULT_PRECIS,/ CLIP_CHARACTER_PRECIS,/ DEFAULT_QUALITY,/ DEFAULT_PITCH or FF_SWISS,/ CTXT("宋体") mov @hFont,eax invoke SelectObject,@hDC,@hFont ;/////////////////////////////////////////////////////// ;MASMPlus上有颜色的数值,于是就直接用十六进制数字代替 RGB 宏了 ;/////////////////////////////////////////////////////// invoke SetTextColor,@hDC,0FF00CCh ;产生紫色的画笔 invoke GetClientRect,@hNotePad,addr @stRect invoke DrawText,@hDC,addr szDrawText,-1,addr @stRect,/ DT_CENTER or DT_VCENTER or DT_SINGLELINE invoke DeleteObject,@hFont invoke ReleaseDC,@hNotePad,@hDC invoke StdOut,CTXT("Draw", 0dh, 0ah) ret _ProcTimer endp ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< start: invoke StdOut,CTXT("Now run the notepad...", 0dh, 0ah) ;==============================强行打开记事本 invoke WinExec,addr szCmdLine,SW_SHOWNORMAL invoke SetTimer,NULL,NULL,1000,addr _ProcTimer mov idTimer,eax .while TRUE invoke GetMessage,addr stMsg,NULL,0,0 .break .if eax == 0 invoke TranslateMessage,addr stMsg invoke DispatchMessage,addr stMsg .endw invoke KillTimer,NULL,idTimer invoke StdIn,addr buffer,sizeof buffer invoke ExitProcess,NULL ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end start
另外,HWND_DESKTOP 是桌面窗口的类名,用invoke FindWindow, HWND_DESKTOP, NULL亦可以返回桌面的句柄,从而达到对桌面操作的目的。