【win32汇编】SendInput发送中文的用法演示
;***************************************************************************************************************** ;作者: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工程
CtrlToSend.zip
(12.14 KB)
[ 本帖最后由 zklhp 于 2012-1-26 01:43 编辑 ]