| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2014 人关注过本帖, 1 人收藏
标题:【win32汇编】SendInput发送中文的用法演示
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏(1)
 问题点数:0 回复次数:4 
【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 编辑 ]
搜索更多相关主题的帖子: 中文 Email 
2012-01-25 23:18
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
自己顶

火狐Nightly发不了图片、、、
2012-01-25 23:25
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
刚发就出错了 还好没人看 已经改好了 嘿嘿
2012-01-26 01:43
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
漂亮
谢谢Z版的分享了!
2012-01-27 17:14
db0916
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-1-8
收藏
得分:0 
按了CTRL键,没反应。
2017-04-19 16:00
快速回复:【win32汇编】SendInput发送中文的用法演示
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030181 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved