zoukankan      html  css  js  c++  java
  • Win32汇编在windows的Notepad上"画"字

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

    在Notepad上绘字

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

     

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

    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    金斗云提醒用法说明
    金斗云提醒软件的原理
    缓存雪崩问题,缓存击穿问题,缓存一致性问题(内存+数据库)
    Spring的ApplicationEvent实现
    区块链技术--区块链的生成和链接
    区块链技术--比特币交易的锁定和解锁
    区块链技术--密码学
    区块链技术--比特币
    jedis中scan的实现
    KafkaManager对offset的两种管理方式
  • 原文地址:https://www.cnblogs.com/kedebug/p/2791758.html
Copyright © 2011-2022 走看看