2012年7月5日星期四

GetMessage.Asm


;一直对消息的理解不是很透彻,早就想写这样的文章。
;自己检测输出自己的信息,是不能自己建立窗口发送信息。这样会混淆消息的,是自己特意发送的,还是系统发送的,自己操作的。
;大多的实现办法是打开一个记书本,然后把信息输出到记事本里面。
;本篇文章,我自创新意,把信息输出到控制台里面。这个不错吧!
;截获消息有两个地方,一个是消息循环,一个是回调处理函数,不知到这两个那个好,经测试,大概是回调函数准确。
;其实这个想法有很久了。今天算是实现了。
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib user32.lib
includelib kernel32.lib

.code
hInstance dd ?
hWinMain dd ?
stMsg MSG <>
szClassName db "correy",0
szCaptionMain db "made by correy",0
pwndclassex dd 48,3,offset liuchunli,0,0,0,0,0,6,0,offset szClassName,0

hstdout dd 0
hstdin dd 0
x dd 0

sz_format_Message db "hwnd:%08xh  "
                  db "message:%08lxh  " 
                  db "wparam:%08lxh  "
                  db "lparam:%08lxh  "
                  db "time:%08xh  " ;//一下三个是加上的,不知正确不?
                  db "x:%08lxh  "
                  db "y:%08lxh"
                  db 13,10,0

buffer db 260 dup (0)

liuchunli proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
  lea eax,stMsg
  invoke wsprintf,addr buffer,addr sz_format_Message,hWnd,uMsg,wParam,lParam,stMsg+16,dword ptr [eax],dword ptr [eax+4]
  invoke lstrlen,addr buffer
  invoke WriteFile,hstdout,addr buffer,eax,addr x,0
  
.IF uMsg==WM_DESTROY
  invoke PostQuitMessage,0
.ELSE
  invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
liuchunli endp

start:
invoke GetStdHandle,-10
mov hstdin,eax
invoke GetStdHandle,-11
mov hstdout,eax

invoke SetConsoleTitle,addr szCaptionMain
invoke SetConsoleScreenBufferSize,hstdout,01000099h;高字是高度,低字是宽度。

invoke GetModuleHandle,0
mov hInstance,eax
mov pwndclassex+20,eax
invoke LoadIcon,hInstance,1;其实这四行也可以去掉。
mov pwndclassex+24,eax
invoke LoadCursor,0,32512
mov pwndclassex+28,eax
invoke RegisterClassEx,addr pwndclassex
invoke CreateWindowEx,200h,offset szClassName,offset szCaptionMain,0cf0000h,80000000h,80000000h,768,399,0,0,hInstance,0;0cf0000h  0ca0000h
mov hWinMain,eax
invoke ShowWindow,hWinMain,1;不想显示这一两行也可以不要。
invoke UpdateWindow,hWinMain ;此行可以去掉

again:invoke GetMessage,addr stMsg,0,0,0;invoke GetMessage,addr stMsg,0,0,0;invoke GetMessage,addr stMsg,hWinMain,0,0 ;只获取本窗口的。
  cmp eax,0
  je exit
  ;invoke TranslateMessage,addr stMsg;这一行也可以去掉,特别是不处理字符信息。  
  invoke DispatchMessage,addr stMsg
jmp again

exit:invoke ExitProcess,0
end start
;made at 2011.10.25
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib user32.lib
includelib kernel32.lib

.code
hInstance dd ?
hWinMain dd ?
stMsg MSG <>
szClassName db "correy",0
szCaptionMain db "made by correy",0
pwndclassex dd 48,3,offset liuchunli,0,0,0,0,0,6,0,offset szClassName,0

hstdout dd 0
hstdin dd 0
x dd 0

sz_format_Message db "hwnd:%08xh  "
                  db "message:%08lxh  " 
                  db "wparam:%08lxh  "
                  db "lparam:%08lxh  "
                  db "time:%08xh  "
                  db "x:%08lxh  "
                  db "y:%08lxh"
                  db 13,10,0

buffer db 260 dup (0)

liuchunli proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IF uMsg==WM_DESTROY
  invoke PostQuitMessage,0
.ELSE
  invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
liuchunli endp

start:
invoke GetStdHandle,-10
mov hstdin,eax
invoke GetStdHandle,-11
mov hstdout,eax

invoke SetConsoleTitle,addr szCaptionMain
invoke SetConsoleScreenBufferSize,hstdout,01000099h;高字是高度,低字是宽度。

invoke GetModuleHandle,0
mov hInstance,eax
mov pwndclassex+20,eax
invoke LoadIcon,hInstance,1;其实这四行也可以去掉。
mov pwndclassex+24,eax
invoke LoadCursor,0,32512
mov pwndclassex+28,eax
invoke RegisterClassEx,addr pwndclassex
invoke CreateWindowEx,200h,offset szClassName,offset szCaptionMain,0cf0000h,80000000h,80000000h,768,399,0,0,hInstance,0;0cf0000h  0ca0000h
mov hWinMain,eax
invoke ShowWindow,hWinMain,1;不想显示这一两行也可以不要。
invoke UpdateWindow,hWinMain ;此行可以去掉。

again:invoke GetMessage,addr stMsg,hWinMain,0,0;invoke GetMessage,addr stMsg,0,0,0;invoke GetMessage,addr stMsg,hWinMain,0,0 ;只获取本窗口的。
  lea eax,stMsg
  invoke wsprintf,addr buffer,addr sz_format_Message,stMsg,stMsg+4,stMsg+8,stMsg+12,stMsg+16,dword ptr [eax],dword ptr [eax+4];,uMsg+24
  invoke lstrlen,addr buffer
  invoke WriteFile,hstdout,addr buffer,eax,addr x,0  
  
  cmp eax,0
  je exit
  ;invoke TranslateMessage,addr stMsg;这一行也可以去掉,特别是不处理字符信息。  
  invoke DispatchMessage,addr stMsg
jmp again

exit:invoke ExitProcess,0
end start
;made at 2011.10.25

没有评论:

发表评论