首页
社区
课程
招聘
[求助]windows消息的一个问题
发表于: 2007-4-27 07:19 6218

[求助]windows消息的一个问题

2007-4-27 07:19
6218
我在程序中没有建立窗体,而是在消息循环中这样处理。大家都是怎么写没有窗体的程序的啊,没有窗体的程序消息怎么处理(除了服务程序)。
local msg:MSG
.while TRUE
invoke GetMessage,addr msg
.break .if eax==0
invoke TranslateMessage,addr msg
assume esi:ptr MSG
invoke _ProcWinMain,[esi].hwnd,[esi].message,[esi].wParam,[esi].lParam
.endw
其中_ProcWinMain是一个类似于普通窗口回调函数的函数。请问为什么我的程序在执行第一行代码时就出错?
反汇编以后是这样的
push 0;出错,EIP=00000000
call GetModuleHandle
这和消息有关吗?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 214
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
模块应该是这样的:
Main        proc        hWnd,wMsg,wParam,lParam
                mov        eax,wMsg(消息)
                .if        eax == WM_CLOSE
               
                .elseif        eax == WM_INITDIALOG
                       
                       
                .elseif        eax == WM_COMMAND
                               
                .else
                        mov        eax,FALSE
                        ret
                .endif
                mov        eax,TRUE
                ret

gMain        endp
2007-4-27 08:31
0
雪    币: 221
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
_ProcWinMain 是个回调函数,请查看MSDN来学习编写这个函数的方法
2007-4-27 11:37
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
4
没有理解我的意思楼上的两位,可能我没说明白
我的意思是我写的这个程序是没有窗口的,我只是自己写个函数来处理接受消息而已。这个函数类似于回调函数。请问这样行吗?
2007-4-27 17:05
0
雪    币: 8599
活跃值: (5060)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
没有窗口怕是不行吧。系统是按窗口来分发消息的。如果没有窗口。系统怎么知道消息是给你的啊。
2007-4-28 00:32
0
雪    币: 221
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
恩,要写没有窗口的进程吗?没有写过
但是要写的话写个dll岂不是更好?
2007-4-29 11:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看看我这个没窗口的程序,通过定时器来处理消息!


.486 
.model flat,stdcall 
option casemap:none 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc 
include kernel32.inc 
includelib kernel32.lib 
include user32.inc 
includelib user32.lib 

killProc proto :dword
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data 

sbar      db "文件夹选项",0

.data?

hInstance HINSTANCE ?  
CommandLine LPSTR ? 
Timerid UINT ?
lpString   byte  127  dup(?) 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


.code 
TimerProc PROC hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

LOCAL fid :dword
LOCAL fwin :dword
LOCAL slen  :dword
invoke  GetForegroundWindow  ;取前台窗口句柄

mov  fwin,eax

invoke  GetWindowText, fwin,addr lpString,100  ;取窗口标题

.if eax==0
  
ret  
  
.endif
  
invoke lstrlen, offset lpString ;获得长度

mov slen,eax

invoke CharUpperBuff,offset lpString,slen ;转为大写

invoke lstrcmp,addr lpString, addr sbar   ;比较文本

 .if eax==0
 	
 invoke killProc,fwin
  
 ;invoke SendMessage,fwin,WM_CLOSE,NULL,NULL
 
 .endif
   
ret
TimerProc endp

killProc PROC hWnd:DWORD
 LOCAL pid:dword
 LOCAL ProcHandle:dword

 invoke GetWindowThreadProcessId,hWnd,addr pid
 
 invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE, pid
 
  mov  ProcHandle,eax
  
  .if ProcHandle!=0
     
  invoke TerminateProcess,ProcHandle,0

  invoke CloseHandle,ProcHandle
  
   .endif

ret 

killProc ENDP


;************************************************************

whileStar PROC


LOCAL @stMsg:MSG

    .while  TRUE
      invoke  GetMessage,addr @stMsg,NULL,0,0
      
      
      .break  .if (!eax)
      
      
            invoke  TranslateMessage,addr @stMsg
      invoke  DispatchMessage,addr @stMsg
    .endw

;......
    
ret

whileStar endp



;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


start:
  invoke GetModuleHandle,NULL  
   mov  hInstance,eax
  
  invoke GetCommandLine   
  
   mov CommandLine,eax                                        
  
 invoke  SetTimer,NULL,NULL,100, addr TimerProc  ;定时器:100ms
 
 mov Timerid,eax
 
 invoke  whileStar  ;进入消息循环,直到收到退出消息
 
 invoke KillTimer,NULL,Timerid
 
invoke  ExitProcess,NULL


;********************************************************************

end  start

2007-4-29 11:49
0
雪    币: 221
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
Timer都出来了
2007-4-29 12:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼上的,怎么呢?
2007-4-29 12:45
0
游客
登录 | 注册 方可回帖
返回
//