首页
社区
课程
招聘
终于解决了message-only windows
发表于: 2009-2-16 21:33 7533

终于解决了message-only windows

2009-2-16 21:33
7533
  这两天给这个问题给搞疯了,试验了N多次,网上的也给找遍了。今天终于解决了问题,不过有一点我不明白,想请问下高人。
  开始的时候我想消息的窗口,用来进程通信。代码是这样的。
var
   wc: TWndClassEx;
begin
   wc.cbSize :=sizeof(TWndClassEx);
       wc.style:=CS_DBLCLKS;
       wc.cbClsExtra:=0;
       wc.cbWndExtra:=0;
       wc.hInstance:=HInstance;
       wc.hIcon:=0;
       wc.hCursor:=0;
       wc.hbrBackground:=0;
       wc.lpszMenuName:=nil;
       wc.lpszClassName:='hcserver';
       wc.lpfnWndProc:=@ServerWpro;
       wc.hIconSm:=0;
     if  RegisterClassEx(wc)<>0 then
      hwmsg :=CreateWindowEx(0, ' wc.lpszClassName, ''
      ,WS_VISIBLE,0,0,0,0,$FFFFFFFD,0,HInstance,nil);
     if hwmsg=0 then
        showmessage(inttohex(getlasterror,8));
end;
    跟踪的时候发现RegisterClassEx可以成功,可是CreateWindowEx却怎么都得不到句柄。
返回值是0,这不算什么,奇怪的是GetLastError 返回的值是0(成功!!!)。
  最后还是在http://www.helpmij.nl/forum/showthread.php?t=369462 找到了解决办法,不过问题解决了,原因不知道。。

   hwmsg :=CreateWindowEx(0, '#32770', 'hcgmsg' ,WS_VISIBLE,0,0,0,0,$FFFFFFFD,0,HInstance,nil);
      windows.SetWindowLong(result,GWL_WNDPROC,Longint(@ServerWpro));
   句柄得到,sendmessage消息后, 在回调数断点有效。两个API解决问题。
 注 #32770为对话框的类名(网上查到的,不知道对不对)。

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
[QUOTE=;]...[/QUOTE]
另在找到一个一个程序,网站不记得了,代码贴出来吧
.386
.model flat, stdcall

option casemap:none
option proc:private

include windows.inc

include kernel32.inc
includelib kernel32.lib

include user32.inc
includelib user32.lib

WM_CUSTOM_MESSAGE = WM_USER + 1001

.data
        hInst                        dd 0
        szClassName                db "MsgOnlyWnd", 0
        szMyTitle                db "Message Only Window", 0
        szMyMessage                db "Custom Message Received!", 0
        szMyClose                db "WM_CLOSE Message Received!", 0
        hwnd                        HWND 0
        wc                                WNDCLASSEX <>       
        msg                                MSG <>
.code
console:
        invoke         GetModuleHandle, NULL
        mov                hInst, eax
       
        ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        ; Register the class
        ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        mov                wc.hInstance, eax        ; hInstance
        mov                wc.lpszClassName, offset szClassName
        mov                wc.lpfnWndProc, offset WndProc
        mov                wc.style, CS_DBLCLKS
        mov                wc.cbSize, sizeof WNDCLASSEX
        mov                wc.hIcon, NULL
        mov                wc.hIconSm, NULL
        mov                wc.hCursor, NULL
        mov                wc.lpszMenuName, NULL
        mov                wc.cbClsExtra, 0
        mov                wc.cbWndExtra, 0
        mov                wc.hbrBackground, NULL
        invoke        RegisterClassEx, addr wc
        .if                !eax
                jmp closing
        .endif
       
        invoke        CreateWindowEx,\
                NULL, \
                addr szClassName,\
                NULL,\
               NULL,\                 ; No need for window style
               0, 0, 0, 0,\ ; Window dimension no longer needed as well
               HWND_MESSAGE,\ ; Message only window
               NULL,\
               hInst,\
               NULL
        mov                hwnd, eax
       
        ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        ; Messageloop
        ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        .while TRUE
                invoke GetMessage, addr msg, hwnd, 0, 0
                .break .if eax != TRUE ; Terminate the loop if quit message received
        .endw
       
        closing:
        invoke        ExitProcess, 0
       
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

        .if uMsg==WM_CUSTOM_MESSAGE
                invoke        MessageBox, hWnd, addr szMyMessage, addr szMyTitle, MB_OK or MB_ICONINFORMATION
        .elseif uMsg==WM_CLOSE
                invoke        MessageBox, hWnd, addr szMyClose, addr szMyTitle, MB_OK or MB_ICONINFORMATION
                invoke        PostQuitMessage, 0
        .endif

        ret
WndProc endp

end console
 发现运行后可以得到句柄,奇怪,。。
2009-2-16 21:37
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
FindWindowEx
2009-2-17 09:25
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
FindWindowEx 只是查找,我要的建立
2009-2-17 09:45
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=;]...[/QUOTE]
终于知道了,为什么!! 
 在执行CreateWindowEx创建窗口过程中会引发对WinProc函数的多次调用。嘿嘿,这可不是可有可无的调用啊!在这里,我们要让缺省窗口过程DefWindowProc来完成一些默认的消息处理操作。你不必知道它做了什么事,只要把这一切消息都“扔”给它就行啦!只有让 DefWindowProc函数完成必要的消息处理,CreateWindowEx函数才能全程地完成窗口的创建(否则,窗口的创建必将失败。)。所以我们添加了调用DefWindowProc的代码。(DefWindowProc的返回值返回的是对消息处理的结果,我们再将它作为WinProc的返回值。)

文章出处
http://hi.baidu.com/zxccabbage/blog/item/f5dfefbf34c1950b19d81fac.html
2009-2-17 09:56
0
游客
登录 | 注册 方可回帖
返回
//