Win32汇编---在windows的Notepad上"画"字

在汇编通讯上看了一篇关于在Notepad上写字的程序,感觉很有趣,于是把程序改进了下。程序首先是利用FindWindow()函数来寻找Notepad的句柄,用SetTimer()每秒触发一次绘图事件,在强制打开的记事本上绘字,具体截图如下:

Win32汇编---在windows的Notepad上"画"字_第1张图片

功能都是在控制台下实现的,方便与测试。实验的源代码如下:

 

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                ;#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亦可以返回桌面的句柄,从而达到对桌面操作的目的。

你可能感兴趣的:(windows)