WIN32汇编: 6.处理键盘消息[1]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 goddragon 的 blog

第六课 处理键盘输入消息


在本课中,我们将要学习windows程序是如何处理键盘消息的。

理论:

因为大多数的pc只有一个键盘,所以所有运行中的windows程序必须共用它。windows 将负责把击键消息送到具有输入焦点的那个应用程序中去。尽管屏幕上可能同时有几个应用程序窗口,但一个时刻仅有一个窗口有输入焦点。有输入焦点的那个应用程序的标题条总是高亮度显示的。 实际上您可以从两个角度来看键盘消息:一是您可以把它看成是一大堆的按键消息的集合,在这种情况下,当您按下一个键时,windows就会发送一个wm_keydown给有输入焦点的那个应用程序,提醒它有一个键被按下。当您释放键时,windows又会发送一个wm_kyeup消息,告诉有一个键被释放。您把每一个键当成是一个按钮;另一种情况是:您可以把键盘看成是字符输入设备。当您按下“a”键时,windows发送一个wm_char消息给有输入焦点的应用程序,告诉它“a”键被按下。实际上windows 内部发送wm_keydown和wwm_keyup消息给有输入焦点的应用程序,而这些消息将通过调用translatemessage翻译成wm_char消息。windows窗口过程函数将决定是否处理所收到的消息,一般说来您不大会去处理wm_keydown、wm_keyup消息,在消息循环中translatemessage函数会把上述消息转换成wm_char消息。在我们的课程中将只处理wm_char。

例子:

.386
.model flat,stdcall
option casemap:none

winmain proto :dword,:dword,:dword,:dword

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

.data
classname db "simplewinclass",0
appname  db "our first window",0
char wparam 20h                         ; the character the program receives from keyboard

.data?
hinstance hinstance ?
commandline lpstr ?

.code
start:
    invoke getmodulehandle, null
    mov    hinstance,eax
    invoke getcommandline
    mov commandline,eax

    invoke winmain, hinstance,null,commandline, sw_showdefault
    invoke exitprocess,eax

winmain proc hinst:hinstance,hprevinst:hinstance,cmdline:lpstr,cmdshow:dword
    local wc:wndclassex
    local msg:msg
    local hwnd:hwnd
    mov   wc.cbsize,sizeof wndclassex
    mov   wc.style, cs_hredraw or cs_vredraw
    mov   wc.lpfnwndproc, offset wndproc
    mov   wc.cbclsextra,null
    mov   wc.cbwndextra,null
    push  hinst
    pop   wc.hinstance
    mov   wc.hbrbackground,color_window+1
    mov   wc.lpszmenuname,null
    mov   wc.lpszclassname,offset classname
    invoke loadicon,null,idi_application
    mov   wc.hicon,eax
    mov   wc.hiconsm,eax
    invoke loadcursor,null,idc_arrow
    mov   wc.hcursor,eax
    invoke registerclassex, addr wc
    invoke createwindowex,null,addr classname,addr appname,\
           ws_overlappedwindow,cw_usedefault,\
           cw_usedefault,cw_usedefault,cw_usedefault,null,null,\
           hinst,null
    mov   hwnd,eax
    invoke showwindow, hwnd,sw_shownormal
    invoke updatewindow, hwnd
    .while true
                invoke getmessage, addr msg,null,0,0
                .break .if (!eax)
                invoke translatemessage, addr msg
                invoke dispatchmessage, addr msg
        .endw
    mov     eax,msg.wparam
    ret
winmain endp

wndproc proc hwnd:hwnd, umsg:uint, wparam:wparam, lparam:lparam
    local hdc:hdc
    local ps:paintstruct

    .if umsg==wm_destroy

本文关键:asm
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top