我想用系统钩子截获WM_SHOWWINDOW消息

blueskystone 2001-01-21 10:54:00
我想用系统钩子截获WM_SHOWWINDOW消息,以达到隐藏某个具体窗体的功能。我试过WH_CBT、WH_CALLWNDPROC 等钩子,但无法完成我的目标。即让一个应用程序正常生成一个对话框,但让它显示不出来。

恳请高手出马,以解小弟燃眉之急。

不用钩子也行,能完成任务就行!小弟在此先谢过了!
...全文
774 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yfish 2001-09-12
  • 打赏
  • 举报
回复
up
舟中夜起 2001-01-26
  • 打赏
  • 举报
回复
还有下面的文章和代码也许对你有所帮助
http://codeguru.earthweb.com/samples/mfc_hooks.shtml
舟中夜起 2001-01-26
  • 打赏
  • 举报
回复
具体参见msdn中
Monitoring System Events
文章
blueskystone 2001-01-26
  • 打赏
  • 举报
回复
我已经截获了系统事件和产生这个事件的窗体名字,但没办法修改具体的消息!
我的代码如下!

void CALLBACK WinEventProc(HWINEVENTHOOK hEvent, DWORD event,
HWND hwndMsg, LONG idObject, LONG idChild, DWORD idThread, DWORD dwmsEventTime)
{
// What type of event is coming through?
TCHAR szBuf [100] ;
switch (event) {
case EVENT_OBJECT_FOCUS: // Focus is changing.
file << "EVENT_OBJECT_FOCUS\n" ;
break;
case EVENT_OBJECT_SHOW :
OnShowEvent(event, hwndMsg,
idObject, idChild,
dwmsEventTime);

GetWindowText(hwndMsg , szBuf , 100) ;
if (strcmp(szBuf , "窗体名字")== 0 )
ShowWindow(hwndMsg, FALSE ) ;
file << "EVENT_OBJECT_SHOW \t" ;
file << szBuf << "\t" ;
sprintf ( szBuf ,"%x \n" , hwndMsg ) ;
file << szBuf ;
break ;
case EVENT_SYSTEM_MENUSTART :
file << "EVENT_SYSTEM_MENUSTART\n" ;
break;
case EVENT_SYSTEM_MENUEND :
file << "EVENT_SYSTEM_MENUEND \n" ;
break;
case EVENT_SYSTEM_DIALOGSTART :
file <<"EVENT_SYSTEM_DIALOGSTART \n" ;
break;
case EVENT_OBJECT_CREATE :
file << "EVENT_OBJECT_CREATE \n" ;
break;
}
return;
}



BOOL SetMyEventHook(void)
{
// Set up an event hook.
hEventHook = SetWinEventHook(EVENT_MIN, // We want all events
EVENT_MAX,
NULL , //GetModuleHandle(NULL),// Use this module
WinEventProc,
0,//GetCurrentProcessId(), // All processes
0,//GetCurrentThreadId(), // All threads
WINEVENT_OUTOFCONTEXT );
// Did we install correctly?
if (hEventHook)
{
MessageBox ( NULL, "SetEvent Ok " , "InDll" , MB_OK ) ;
return(TRUE);
}
MessageBox ( NULL, "SetEvent Fail " , "InDll" , MB_OK ) ;
// Did not install properly - fail
return(FALSE);
}

BOOL DelMyEventHook(void)
{
BOOL bRet ;
bRet = UnhookWinEvent (hEventHook);
return (bRet);
}
/////////////////////////////////////////////
多谢Kronus,你给我的例子对我帮助很大,谢谢!

blueskystone 2001-01-24
  • 打赏
  • 举报
回复
各位大侠帮小弟一把!!!
reigod 2001-01-23
  • 打赏
  • 举报
回复
把代码贴出来!
oulix 2001-01-23
  • 打赏
  • 举报
回复
旁听
blueskystone 2001-01-23
  • 打赏
  • 举报
回复
问题是这样的,当使用Microsoft网络用户时,进入windows会弾要求输入用户名和密码的对话框。我想不让它显示,就达到这个目的,仅此而已。至于如何进入系统就另外讨论了。
即我不知道对话框所在的线程ID,以及对话框什么时候弹出。因此想截获WINDOWS的WM_SHOWWINDOW消息。我现在要截获的是系统消息,因此肯定要做在DLL里。但我不知道什么钩子可以截获WM_SHOWWINDOW,并且要能够修改着个消息。
blueskystone 2001-01-22
  • 打赏
  • 举报
回复
我HOOK的不是本进程的窗体。是想把别的进程产生的窗体给隐藏掉,即在它产生WM_SHOWWINDOW前修改这个消息。

还是iProgram 明白小弟的心思。
帮帮小弟!!!

Nicrosoft 好!又在赶夜车!
Nicrosoft 2001-01-22
  • 打赏
  • 举报
回复
哈哈,blueskystone,又见到你了,记得我吗?
iProgram 2001-01-22
  • 打赏
  • 举报
回复
blueskystone的意思是不是指Hook本进程外的窗口?如是这样的话生命在于不动的方法动得了吗?我想blueskystone的意思是Hook到ShowWindow API,然后用SW_HIDE替换SW_SHOW?还是HOOK WM_SHOWWINDOW消息?后者的话怎么使其只Create不Show?还有,不会是针对所有窗口吧?呜呼,如此麻烦,超级关注.
Robert2001 2001-01-22
  • 打赏
  • 举报
回复
两位高人 已经发话了,我鼓掌就是了!!
但是还有没有其他的方法啊!!
visual 2001-01-22
  • 打赏
  • 举报
回复
你是不是线程的id得错了。
还有想hook进程外的窗口好像必须得做另做一个dll。我就在本进程内hook window桌面的线程就死活没成功,后来看了资料另做了一个dll才搞定。
如果你hook的线程的id right(可用spy++看看)并且又另做了一个hook的dll,那当我没说。
blueskystone 2001-01-22
  • 打赏
  • 举报
回复
是不是嫌我的分数太少,高手不愿出手。不是我不想,是系统只允许我0-22 ,我有1000点可用分,如那位肯出手,分一半个你。
blueskystone 2001-01-22
  • 打赏
  • 举报
回复
前面写错了,在系统把消息回送给应用程序之前不是产生时,见笑!
无我无人 2001-01-21
  • 打赏
  • 举报
回复
sorry 上面笔误! 少写了个 '~'

((LPWINDOWPOS)lParam)->flags &= ~SWP_SHOWWINDOW; // 即去掉bit SWP_SHOWWINDOW


无我无人 2001-01-21
  • 打赏
  • 举报
回复
不要hook了!大家都在喊hook,好像除了hook什么都不能做了。要真是这样,微软也太失败了。
正解如下!

响应消息 WM_WINDOWPOSCHANGING 把传入的 WINDOWPOS struct中的 flags 做下面的操作。
然后 return DefWindowProc();

((LPWINDOWPOS)lParam)->flags &= SWP_SHOWWINDOW; // 即去掉bit SWP_SHOWWINDOW

silver 2001-01-21
  • 打赏
  • 举报
回复
不太清楚你的意思,这个应用程序是你自己写的还是别人的?是什么样的程序?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧