游侠无极限 发表于 2003-10-31 23:31:00

EnableButton,大家自己看看是做什么的吧

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; EnableButton ALL For bbs.xsclub.com
; by 游侠无极限
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; EndableButton.asm
; 基于对话框资源
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      .386
      .model flat, stdcall
      option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include      windows.inc
include      user32.inc
includelib    user32.lib
include      shell32.inc
includelib    shell32.lib
include      kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN      equ      104    ;图标
DLG_MAIN      equ      101    ;对话框
EDIT_MAIN    equ      1002    ;编辑框
ID_ABOUT      equ      1000    ;关于按钮
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      .data?

hInstance    dd      ?
hHook            dd      ?
hWndMain      dd      ?
IsStop      dd      ?

      .const
szStart      db      '启动',0
szStop      db      '停止',0
szCaption    db      'EnableButton',0
szInfo      db      '版权没有 03.8.20 游侠无极限制作',0
szErr            db      '安装钩子失败,原因不明',0
szWnd            db      '%lxH',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;钩子回调函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_HookProc    proc    _dwCode,_wParam,_lParam
      local @szBuffer:byte
      invoke    CallNextHookEx,hHook,_dwCode,_wParam,_lParam    ;钩子链传递
      pushad
      .if    _dwCode == HC_ACTION      ;Windows要移除一条消息时
            mov    ebx,_lParam
            assume    ebx:ptr EVENTMSG
            .if    [ebx].message == WM_LBUTTONDOWN
                  mov    eax,[ebx].hwnd      ;取得当前鼠标所在控件句柄
                  invoke    wsprintf,addr @szBuffer,addr szWnd,eax
                  invoke    SetDlgItemText,hWndMain,EDIT_MAIN,addr @szBuffer;显示句柄
                  invoke    IsWindowEnabled,[ebx].hwnd    ;判断控件是否无效
                  .if    eax == FALSE
                        invoke    EnableWindow,[ebx].hwnd,TRUE    ;使控件可用
                  .endif
                ;.endif
            .endif
            assume    ebx:nothing
      .endif

      popad
      xor    eax,eax
      ret
_HookProc    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_ProcDlgMain    proc    uses ebx edi esi hWnd,wMsg,wParam,lParam

      mov    eax,wMsg
      .if    eax == WM_CLOSE   
            .if    IsStop != TRUE
                invoke    UnhookWindowsHookEx,hHook    ;卸载钩子
            .endif
            invoke    EndDialog,hWnd,NULL
      .elseif    eax == WM_INITDIALOG
            invoke    LoadIcon,hInstance,ICO_MAIN
            invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
            invoke    SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE    ;窗口最顶层
            mov    IsStop,TRUE
            push    hWnd
            pop    hWndMain
      .elseif    eax == WM_COMMAND
            mov    eax,wParam
            .if    ax == IDOK
                .if    IsStop == TRUE
                  invoke    SetDlgItemText,hWnd,IDOK,offset szStop
                  invoke    SetWindowsHookEx,WH_JOURNALRECORD,addr    _HookProc,hInstance,NULL    ;挂钩,日志记录钩子
                  .if    eax
                        mov    hHook,eax
                  .else    ;挂钩失败
                        invoke    MessageBox,hWnd,offset szErr,offset szCaption,MB_OK or MB_ICONWARNING
                  .endif
                  mov    IsStop,FALSE
                .else
                  invoke    SetDlgItemText,hWnd,IDOK,offset szStart
                  invoke    UnhookWindowsHookEx,hHook
                  mov    IsStop,TRUE
                .endif
            .elseif    ax == IDCANCEL
                invoke    SendMessage,hWnd,WM_CLOSE,NULL,NULL
            .elseif    ax == ID_ABOUT
                invoke    ShellAbout,hWnd,offset szCaption,offset szInfo,NULL    ;关于对话框
            .endif
      .else
            mov    eax,FALSE
            ret
      .endif
      mov    eax,TRUE
      ret

_ProcDlgMain    endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
      invoke    GetModuleHandle,NULL
      mov    hInstance,eax
      invoke    DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
      invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      end    start


界面看下图片
<img src="attachments/dvbbs/2003103123302578309.gif" border="0" onclick="zoom(this)" onload="if(this.width>document.body.clientWidth*0.5) {this.resized=true;this.width=document.body.clientWidth*0.5;this.style.cursor='pointer';} else {this.onclick=null}" alt="" />






[此贴子已经被作者于2003-10-31 23:37:05编辑过]

bigfoot 发表于 2003-11-1 11:10:00

搞了个WH_JOURNALRECORD hook,大概是把变灰的控件Enable,有点意思
不过这类界面程序实在不是汇编的强项,用了大量的invoke,整个程序结构看上去和c别无二致
汇编的强项不在这里,楼主如果想显耀汇编的强大,这个例子不怎么,
再来一个强一点的原创瞧瞧 ^_^



[此贴子已经被作者于2003-11-1 11:16:10编辑过]

firelinux 发表于 2003-11-19 00:14:00

bigfoot,留个QQ怎么样。
页: [1]
查看完整版本: EnableButton,大家自己看看是做什么的吧