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

终于解决了message-only windows

2009-2-16 21:33
7713
  这两天给这个问题给搞疯了,试验了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(成功!!!)。
  最后还是在124K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3S2W2L8s2m8E0K9h3A6Q4x3X3g2F1L8q4)9J5c8X3k6G2M7Y4g2E0i4K6u0r3M7$3S2G2N6%4c8Z5M7X3g2S2k6q4)9J5k6i4m8Z5M7q4)9K6c8Y4c8Q4x3@1b7K6y4U0V1@1y4U0u0Q4c8e0y4Q4z5o6m8Q4z5o6m8Q4c8e0k6Q4z5o6W2Q4b7V1g2Q4c8e0g2Q4z5o6S2Q4b7U0m8Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8e0S2Q4b7e0N6Q4b7e0y4Q4c8e0g2Q4z5o6k6Q4b7U0y4Q4c8e0g2Q4z5p5q4Q4z5f1g2Q4c8e0k6Q4b7U0y4Q4z5e0g2Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0c8Q4b7U0S2Q4z5p5c8Q4c8e0S2Q4b7V1k6Q4z5o6N6Q4c8e0W2Q4z5e0N6Q4b7f1g2Q4c8e0W2Q4b7e0u0Q4z5e0S2Q4c8e0S2Q4b7e0N6Q4b7e0y4Q4c8e0g2Q4z5o6k6Q4b7U0y4Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4z5p5g2Q4z5f1k6Q4c8e0g2Q4z5f1u0Q4b7e0m8Q4c8e0c8Q4b7U0S2Q4z5p5c8Q4c8e0N6Q4z5f1k6Q4b7e0g2Q4c8e0W2Q4z5o6q4Q4z5e0y4Q4c8e0y4Q4z5o6m8Q4z5o6u0Q4c8e0y4Q4z5o6m8Q4z5o6t1`.

   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为对话框的类名(网上查到的,不知道对不对)。

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 204
活跃值: (20)
能力值: ( 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
活跃值: (275)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
FindWindowEx
2009-2-17 09:25
0
雪    币: 204
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
FindWindowEx 只是查找,我要的建立
2009-2-17 09:45
0
雪    币: 204
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=;]...[/QUOTE]
终于知道了,为什么!! 
 在执行CreateWindowEx创建窗口过程中会引发对WinProc函数的多次调用。嘿嘿,这可不是可有可无的调用啊!在这里,我们要让缺省窗口过程DefWindowProc来完成一些默认的消息处理操作。你不必知道它做了什么事,只要把这一切消息都“扔”给它就行啦!只有让 DefWindowProc函数完成必要的消息处理,CreateWindowEx函数才能全程地完成窗口的创建(否则,窗口的创建必将失败。)。所以我们添加了调用DefWindowProc的代码。(DefWindowProc的返回值返回的是对消息处理的结果,我们再将它作为WinProc的返回值。)

文章出处
cf1K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6*7P5r3y4U0j5h3u0T1j5h3N6W2i4K6u0r3j5X3I4G2k6#2)9J5c8X3W2@1k6h3#2Q4x3V1k6X3y4h3c8X3k6h3k6T1k6U0x3@1j5K6p5&6y4e0m8T1x3e0W2V1z5o6q4X3j5h3y4Q4x3X3g2Z5N6r3#2D9
2009-2-17 09:56
0
游客
登录 | 注册 方可回帖
返回