case HCBT_CREATEWND:
{
     LPCBT_CREATEWND pcbt = (LPCBT_CREATEWND)lParam;
LPCREATESTRUCT   pcs   =   pcbt->lpcs;  pcs->lpszName="11111111111111";
pcs->style=WS_OVERLAPPEDWINDOW
|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_OVERLAPPED;
pcs->dwExStyle=WS_EX_LEFT|WS_EX_LTRREADING
|WS_EX_RIGHTSCROLLBAR|WS_EX_WINDOWEDGE;
}
为什么我这里无论修改任何窗口属性 结果都没有变化?
哪里出错了呢?

解决方案 »

  1.   

    pcs->lpszName="11111111111111"; 
    lpszName赋值为局部指针,不可以。
      

  2.   

    不是很明白,为什么隐藏窗口你要使用WH_CBT钩子。
    http://topic.csdn.net/t/20030515/15/1788254.html
      

  3.   

    你安装WH_CBT钩子后,你的钩子程序可以收到WM_CREATE/WM_NCCREATE消息的,你应该在钩子程序里面的这个消息中处理隐藏窗口.你在处理HCBT_ACTIVATE
    HCBT_CREATEWND时必须返回0,不能返回其他的值.
      

  4.   

    LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam) 

    switch (nCode) 

    case HCBT_ACTIVATE: 

    HWND hWnd = (HWND)wParam; 
    ::ShowWindow(hWnd, SW_HIDE);
    break;
    //.......
    }
    return CallNextHookEx(g_hHook, nCode, wParam, lParam); 
    }  这样应该是可行的,你的问题还可能是其他的原因,因为你仅仅在HCBT_ACTIVATE后隐藏了其他进程的窗口,但是其他的程序仍然可能在以后的某个时候调用ShowWindow(hWnd, SW_SHOW);来显示窗口的,因此你看不到隐藏的效果并不是你的代码没有其作用,而是其他的程序的代码在后来修改了窗口的显示。
      

  5.   

    楼上return CallNextHookEx()参数还需要做对应修改吧
      

  6.   

    楼上的大大,问题不是这样的
    如果按你的代码,我昨天也测试过了
    在case HCBT_ACTIVATE:  如果不处理 就正常如果在case HCBT_ACTIVATE:  下::ShowWindow(hWnd, SW_HIDE); 
    会导致多了一个HCBT_DESTROYWND 
    窗口直接关闭了 不知道什么原因但是从外部先找到他的HWND 然后 ::ShowWindow(hWnd, SW_HIDE); 确实能隐藏它的窗口 而不会导致关闭
      

  7.   

    8楼的说的可能有道理::ShowWindow(hWnd, SW_HIDE);  后 return CallNextHookEx()的参数可能还要做修改 但是我按照隐藏后的状态
    把参数修改了
    LPCBT_CREATEWND pcbt = (LPCBT_CREATEWND)lParam; 
    LPCREATESTRUCT   pcs   =   pcbt->lpcs;  pcs->style=WS_OVERLAPPEDWINDOW 
    ¦WS_CLIPSIBLINGS ¦WS_CLIPCHILDREN ¦WS_OVERLAPPED; 
    pcs->dwExStyle=WS_EX_LEFT ¦WS_EX_LTRREADING 
    ¦WS_EX_RIGHTSCROLLBAR ¦WS_EX_WINDOWEDGE; 
    还是会导致窗口关闭如果截获关闭消息 强行让它不关闭 让它直接返回-1那么窗口就显示异常了
      

  8.   

    在HCBT_ACTIVATE中用SetWindowLong试试。HCBT_CREATEWND是创建窗口是产生的,之后程序还要执行ShowWindow,所以这里隐藏是没用的。
      

  9.   

    SetWindowLong(hWnd,GWL_STYLE,pcs->style&~WS_VISIBLE);发生错误...我是拿IEEXPLORER做实验
      

  10.   

    HCBT_ACTIVATE中是CBTACTIVATESTRUCT结构,没有窗口风格,你需要先GetWindowLong。
      

  11.   

    SetWindowLong(hWnd,GWL_STYLE,GetWindowLong(hWnd,GWL_STYLE)&~WS_VISIBLE);不过效果和::ShowWindow(hWnd, SW_HIDE);  似乎一样用IEXPLORER测试 仍然导致HCBT_DESTROYWND发生  
      

  12.   

    LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)  
    {  
    if (code == HCBT_CREATEWND)
    {
       HWND hWnd = (HWND)wParam;
       (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)YourWindowProc); // 替换窗口过程
    }
    }  .... YourWindowProc(....)
    {
      // 在这里根据不同的消息来,隐藏窗口,修改STYLE等等
    }MFC就是这么干的
      

  13.   

    啊 头晕了 YourWindowProc这个函数改如何写呢?我并不清楚IEXPLORER是如何处理的啊?
      

  14.   

    现在能确定的是:
    当IEXPLORER主窗口创建的时候
    首先是产生一个HCBT_CREATEWND
    在这里设置任何属性修改 不出错也没有效果然后是一个HCBT_ACTIVATE
    在这里处理的话1.LPCBT_CREATEWND pcbt = (LPCBT_CREATEWND)lParam;
    LPCREATESTRUCT   pcs   =   pcbt->lpcs; 
    pcs->style=pcs->style&~WS_VISIBLE; 
       这样处理就是IEXPLORER出错
    2.SHOWWINDOW SW_HIDE 这样会导致IEXPLORER产生DESTROY消息 自己关闭窗口3. SetWindowLong(hWnd,GWL_STYLE,GetWindowLong(hWnd,GWL_STYLE)&~WS_VISIBLE);
      一样会导致IEXPLORER产生DESTROY消息 自己关闭窗口4.按照laiyiling说的;if (code == HCBT_CREATEWND) 

       HWND hWnd = (HWND)wParam; 
       (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)YourWindowProc); // 替换窗口过程 

    }   .... YourWindowProc(....) 

      // 在这里根据不同的消息来,隐藏窗口,修改STYLE等等 
    } 这个YourWindowProc函数不会处理 不知道什么效果
    哪位大大能在IEXPLORER窗口显示前 把它的属性修改成不可见吗?
      

  15.   

    SetWindowLong的时候保存原WindowProc,在YourWindowProc中判断WM_SHOWWINDOW消息,用SW_HIDE去调用原WindowProc,这样试试,不过可能也会导致DESTROY。
      

  16.   

    去看MFC的源代码:// 经过简化:
    void AFXAPI AfxHookWindowCreate(CWnd* pWnd)
    {
       // MFC sets a thread-global m_pWndInit, which points
       // to the window being created. This is the only way
       // CWnd::CreateEx and AfxHookWindowCreate can communicate
       // with the hook function, SetWindowsHookEx does not let
       // you pass an argument for the hook function.
       //
       _AFX_THREAD_STATE* pThreadState = 
          _afxThreadState.GetData();   // If this window is already hooked for creation, ignore.
       // In theory, this should not happen.
       if (pThreadState->m_pWndInit == pWnd)
          return;   if (pThreadState->m_hHookOldCbtFilter == NULL) {
          // Create the hook:
          pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(WH_CBT,
             _AfxCbtFilterHook, NULL, ::GetCurrentThreadId());
          if (pThreadState->m_hHookOldCbtFilter == NULL)
             AfxThrowMemoryException();
       }   // Below are sanity checks
       ASSERT(pThreadState->m_hHookOldCbtFilter != NULL);
       ASSERT(pWnd != NULL);
       ASSERT(pWnd->m_hWnd == NULL);   // only do once   ASSERT(pThreadState->m_pWndInit == NULL);   // hook not already in progress
       pThreadState->m_pWndInit = pWnd;            // set the m_pWndInit global !!
    }// 经过简化:
    LRESULT _AfxCbtFilterHook(int code, WPARAM wParam, LPARAM lParam)
    {
        _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
        if (code != HCBT_CREATEWND)
            // ignore    // subclass the window with AfxWndProc
        CWnd* pWndInit = pThreadState->m_pWndInit;
        pWndInit->Attach((HWND)wParam);
        pWndInit->PreSubclassWindow(); // virtual
        WNDPROC *pOldWndProc = pWndInit->GetSuperWndProcAddr();
        ASSERT(pOldWndProc != NULL);    WNDPROC afxWndProc = AfxGetAfxWndProc();
        oldWndProc = (WNDPROC)SetWindowLong(hWnd, 
            GWL_WNDPROC, (DWORD)afxWndProc);
        if (oldWndProc != afxWndProc)
            *pOldWndProc = oldWndProc;
        pThreadState->m_pWndInit = NULL;    return lResult;
    }
    你的重点是看看afxWndProc、_AfxCbtFilterHook、AfxHookWindowCreate这三个函数即可,你写的代码完全可以从里面挑拣出来.