![]() |
#2
zklhp2012-01-25 23:25
|
;作者:zklhp
;Email:zklhp@
;QQ:493165744
;最后更新:2012.1.25
;*****************************************************************************************************************
只有本站会员才能查看附件,请 登录
废话不说上代码

;MASMPlus 代码模板 - 以对话框做为主窗口的程序
;*****************************************************************************************************************
;作者:zklhp
;Email:zklhp@
;QQ:493165744
;最后更新:2012.1.25
;*****************************************************************************************************************
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
include rsrc.inc
DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
KEYBDINPUT STRUCT
wVk WORD ? ;虚拟键盘码
wScan WORD ? ;键盘扫描码
dwFlags DWORD ? ;标志
time DWORD ? ;消息时间
dwExtraInfo DWORD ? ;扩展信息
KEYBDINPUT ENDS
MOUSEINPUT STRUCT
_dx DWORD ? ;鼠标X坐标(意义和范围由dwFlags决定)
_dy DWORD ? ;鼠标Y坐标(意义和范围由dwFlags决定)
mouseData DWORD ? ;鼠标X按钮,滚轮等特殊信息
dwFlags DWORD ? ;标志
time DWORD ? ;消息时间
dwExtraInfo DWORD ? ;扩展信息
MOUSEINPUT ENDS
HARDWAREINPUT STRUCT
uMsg DWORD ?
wParamL WORD ?
wParamH WORD ?
HARDWAREINPUT ENDS
INPUT STRUCT
_type DWORD ? ;标志
UNION ;输入联合体
mi MOUSEINPUT <> ;鼠标输入
ki KEYBDINPUT <> ;键盘输入
hi HARDWAREINPUT <> ;硬件输入(9x)
ENDS
INPUT ENDS
.data
;这是Unicode转换后的
szErr db 0A9H,094H,050H,05BH,089H,05BH,0C5H,088H,0FAH,051H,019H,095H,020H,000H,000H,090H,0FAH,051H,07EH,000H,020H,000H,0D9H,08FH,021H,06BH,0A1H,06CH,06CH,08FH,062H,063H,019H,095H,0,0
szErrCap db 019H,095H,0EFH,08BH,0,0
.data?
hInstance dd ?
hHook dd ?
hWin dd ?
.CODE
SendUnicode proc
local stInput[2]:INPUT
invoke RtlZeroMemory,addr stInput,sizeof INPUT * 2
mov stInput._type,INPUT_KEYBOARD
mov stInput.ki.wScan,di
mov stInput.ki.dwFlags,KEYEVENTF_UNICODE
;!!!刚写完的时候失败了 调试发现是因为写成了stInput[1] 这里不是C语言 不能这么写!!!
mov stInput[sizeof INPUT]._type,INPUT_KEYBOARD
mov stInput[sizeof INPUT].ki.wScan,di
mov stInput[sizeof INPUT].ki.dwFlags,KEYEVENTF_KEYUP or KEYEVENTF_UNICODE
invoke SendInput,2,addr stInput,sizeof INPUT
ret
SendUnicode endp
;用钩子不是很稳定 很可能崩溃~
HookProc proc _dwCode,_wParam,_lParam
local @szBuf[256]:BYTE
;local @point:POINT
invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam
pushad
.if _dwCode == HC_ACTION
mov ebx,_lParam
assume ebx:ptr EVENTMSG
.if [ebx].message == WM_KEYDOWN || [ebx].message == WM_SYSKEYDOWN
mov eax,[ebx].paramL
and eax,0ffh
.if al == VK_CONTROL
invoke RtlZeroMemory,addr @szBuf,sizeof @szBuf
invoke GetDlgItemTextW,hWin,IDC_EDT1,addr @szBuf,sizeof @szBuf / 2
lea esi,@szBuf
.while WORD ptr [esi] != 0
mov di,[esi] ;不用堆栈传参数了
invoke SendUnicode
add esi,2
.endw
.endif
.endif
assume ebx:nothing
.endif
popad
xor eax,eax
ret
HookProc endp
DlgProc proc hWnd,uMsg,wParam,lParam
local @szBuf[256]:BYTE
.if uMsg==WM_INITDIALOG
push hWnd
pop hWin
invoke SetWindowsHookExW,WH_JOURNALRECORD,addr HookProc,hInstance,NULL
.if eax
mov hHook,eax
.else
invoke MessageBoxW,0,offset szErr,offset szErrCap,0
invoke EndDialog,hWnd,NULL
.endif
.elseif uMsg==WM_COMMAND
mov eax,wParam
and eax,0ffffh
.if eax==IDCANCEL
invoke SendMessageW,hWnd,WM_CLOSE,0,0
.endif
.elseif uMsg==WM_CLOSE
invoke UnhookWindowsHookEx,hHook
invoke EndDialog,hWnd,wParam
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
START:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParamW,hInstance,IDD_DLG1,0,offset DlgProc,0
invoke ExitProcess,0
END START
除了注释里面的注意事项外再说一点 这个程序是个Unicode的 里面的字符定义是程序转换得来的 要是要这个转换程序的话我可以发。。。
代码+程序+MasmPlus工程
只有本站会员才能查看附件,请 登录
[ 本帖最后由 zklhp 于 2012-1-26 01:43 编辑 ]