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编辑过]
搞了个WH_JOURNALRECORD hook,大概是把变灰的控件Enable,有点意思
不过这类界面程序实在不是汇编的强项,用了大量的invoke,整个程序结构看上去和c别无二致
汇编的强项不在这里,楼主如果想显耀汇编的强大,这个例子不怎么,
再来一个强一点的原创瞧瞧 ^_^
[此贴子已经被作者于2003-11-1 11:16:10编辑过]
bigfoot,留个QQ怎么样。
页:
[1]