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;
}
为什么我这里无论修改任何窗口属性 结果都没有变化?
哪里出错了呢?
{
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;
}
为什么我这里无论修改任何窗口属性 结果都没有变化?
哪里出错了呢?
lpszName赋值为局部指针,不可以。
http://topic.csdn.net/t/20030515/15/1788254.html
HCBT_CREATEWND时必须返回0,不能返回其他的值.
{
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);来显示窗口的,因此你看不到隐藏的效果并不是你的代码没有其作用,而是其他的程序的代码在后来修改了窗口的显示。
如果按你的代码,我昨天也测试过了
在case HCBT_ACTIVATE: 如果不处理 就正常如果在case HCBT_ACTIVATE: 下::ShowWindow(hWnd, SW_HIDE);
会导致多了一个HCBT_DESTROYWND
窗口直接关闭了 不知道什么原因但是从外部先找到他的HWND 然后 ::ShowWindow(hWnd, SW_HIDE); 确实能隐藏它的窗口 而不会导致关闭
把参数修改了
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那么窗口就显示异常了
{
if (code == HCBT_CREATEWND)
{
HWND hWnd = (HWND)wParam;
(WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)YourWindowProc); // 替换窗口过程
}
} .... YourWindowProc(....)
{
// 在这里根据不同的消息来,隐藏窗口,修改STYLE等等
}MFC就是这么干的
当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窗口显示前 把它的属性修改成不可见吗?
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这三个函数即可,你写的代码完全可以从里面挑拣出来.