本人开发的动态库dll供别人使用;
使用dll只给我传了窗口句柄 在dll需要捕捉窗体改变大小消息有没有什么办法?????????
我网上查了下 ;钩子可以实现吗?

解决方案 »

  1.   

    钩子当然是可以的,你可以尝试下这个
    PretranslateMessageBOOL CtestDlg::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: Add your specialized code here and/or call the base class
            if(pMsg == WM_SIZE)
            {        }
    return CDialog::PreTranslateMessage(pMsg);
    }不知道可以么,推荐楼主尝试啊
      

  2.   

    2种方案:
     1. Subclass窗口
     2. 让别人再改变窗口大小Move你的窗口,或是让他通知你
      

  3.   

    钩子可以,特别假如窗口句柄是其他进程的,就非钩子不可啦。用SetWindowLong替换窗口过程也可以,就是子类化啦。
    WNDPROC OLDWNDPROC;
    LRESULT CALLBACK MyWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    switch(message)
    {
    case WM_SIZE:
    {

    }
    break; default:
    return ::CallWindowProc(OLDWNDPROC, hWnd, message, wParam, lParam); 
    }
    return 0;
    }//创建窗口函数
    void CreateWnd()
    {
    HWND hWnd=CreateWindowEx(WS_EX_TOPMOST,_T("#32770"), _T("Hello"),
    WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,200,200,NULL,NULL,NULL,NULL); //把hWnd的默认窗口过程替换为kkWndProc,返回默认函数过程的函数指针
    OLDWNDPROC=(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC, (LONG) (MyWndProc));
    }
      

  4.   

    如果hWnd和你是一个进程,你可以用SetWindowLong(hWnd,GWL_WNDPROC, (LONG)(WndProc));
    来子类化窗口。这样就可以处理hWnd的所有消息了。
    如果hWnd和你不是一个进程,你必须写个dll,用CreateRemoteThread的方法,把你写的dll注入到对方进程,然后再按上面说的子类化hWnd.
      

  5.   

    老大,一个函数就搞定了!!!
    ::MoveWindow(窗口句柄,位置...)
      

  6.   

    上面是改变窗口大小下面是获取窗口大小BOOL GetWindowRect(          HWND hWnd,    LPRECT lpRect);
    超Easy
      

  7.   

    10楼的方法挺不错 简单 易懂你可以创建个线程来实时监控 如果这个CRect的成员的大小发生变化那不就捕捉到了
      

  8.   

    以下几种办法:
    1、子类化窗口。使用SetWindowLong(GWL_WNDPROC, ...)将窗口过程改为自己的窗口过程,这其中拦截WM_SIZE消息。
    2、进程内消息hook,使用SetWindowsHookEx(WH_CALLWNDPROC,...)来捕获窗口消息,在其中过滤WM_SIZE.
    3、(楼下补充)
      

  9.   

    HHOOK IEHook; //全域LRESULT CALLBACK HookIECallBack(int nCode, WPARAM wParam, LPARAM lParam)
    {
    if (nCode >= 0)
    {
    CWPSTRUCT*  data= (CWPSTRUCT*)lParam;
    if (data->message == WM_SIZE)
    {
    //处理message
    }
    }
    return CallNextHookEx(IEHook, nCode, wParam, lParam);
    }IEHook = ::SetWindowsHookEx(WH_CALLWNDPROC,HookIECallBack,::GetModuleHandle(NULL),0);
    //释放
    UnhookWindowsHookEx(IEHook);