怎么hook指定的对话框

花熊 2011-07-27 09:29:42

比如CFileDialog Dlg(true);Dlg.doModal();
我怎么只hook这一个Dlg,我刚开始想法是把它的m_hwnd记录下来,在hook过程中判断,后发现m_hwnd为空,后面改为传入&Dlg,发现已抓不到WM_NCCREATE消息了,估计是CFileDialog Dlg(true)这一步声明时内部进行了WM_NCCREATE处理, 问题:
我是希望在对话框初始时只做一个钩子,能随时加入要钩取的对象,自由控制这个对话框中要钩取的和不要钩取的对象(比如我只想让对话框的某一个按钮被钩取,另几个不被钩取),也可以对弹出的模态对话框进行同样的控制,不知道有没有这种可能,期待高手指点?如有实现相类似自定义钩取的DEMO,可否提供,QQ:80718901@qq.com,万分感谢。

给思路的给分,高手请加QQ指点,谢谢。
...全文
299 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2011-07-30
  • 打赏
  • 举报
回复
'怎么hook指定的对话框'还是hook ‘CFileDialog’?
大熊猫侯佩 2011-07-30
  • 打赏
  • 举报
回复
你可以看MFC中对话框建立的源代码,找到hook点,用dexx或暴力asm方式插入,有事再Q我。
花熊 2011-07-30
  • 打赏
  • 举报
回复
回答的XDJM的请看清问题:比如我只想让对话框的某一个按钮被钩取,另几个不被钩 我只要思路,至于代码实现问题不大,我现在思路是根据窗口类型-Style-标题,来区分不同的绘制。
maquan 2011-07-30
  • 打赏
  • 举报
回复
说实话,我看了好几遍也没看懂楼主的问题,楼上的弟兄们都看懂了吗?
[Quote=引用楼主 hgy413 的回复:]
……(比如我只想让对话框的某一个按钮被钩取,另几个不被钩取)……
[/Quote]
“被钩取”是什么意思?要达到什么效果?


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
jacky_qiu 2011-07-30
  • 打赏
  • 举报
回复
之前我一直在学习hook Opera 令其自动保存我指定的网页为mht,所以积累了些知识,希望对你有用,如果有不明的可以email我 qiujiejia@gmail.com

事例代码下载:http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC/HookDialog.zip
(请不要使用下载工具,否则可能出错)



#include "Subclass.h"

/****************************************************************************
子类化“另存为”对话框,
用于使对话框隐藏和禁止文件名edit框输入字符串
****************************************************************************/
HWND g_SaveWnd=NULL;
class CSaveWnd :public CSubclass
{
public:
LRESULT WindowProc(UINT message,WPARAM wParam,LPARAM lParam);
};

LRESULT CSaveWnd::WindowProc(UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_WINDOWPOSCHANGING:
{
trace("WM_WINDOWPOSCHANGING");

/*
//禁用标题输入combobox
::EnableWindow(::GetDlgItem(m_hWnd,1148),false);
*/
}
break;
}
return ::CallWindowProc(OldWndProc,m_hWnd, message, wParam, lParam);
}



/***************************************************************************
子类化窗口 使用thunk技术
****************************************************************************/
class CSubEdit :public CSubclass
{
public:
LRESULT WindowProc(UINT message,WPARAM wParam,LPARAM lParam);
};

LRESULT CSubEdit::WindowProc(UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CHAR:
trace(wParam);
return true;
break;
}
return ::CallWindowProc(OldWndProc,m_hWnd, message, wParam, lParam);
}



/****************************************************************************
CBTProc
****************************************************************************/
void UnCBTProcHook();
HHOOK g_hCBTProc=NULL;
LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam, LPARAM lParam)
{
if (nCode<0 )
return CallNextHookEx(g_hCBTProc,nCode,wParam,lParam); //传递钩子信息

switch ( nCode )
{
//━━━━━━━━━子类化对话框━━━━━━━━━━━
case HCBT_ACTIVATE:
{
if (g_SaveWnd==NULL)
{
HWND hWnd=(HWND)wParam;
TCHAR WindowText[30]={0};
::GetWindowText(hWnd,WindowText,sizeof(WindowText)/sizeof(TCHAR));

//终于找到弹出保存对话框
if (_tcscmp(WindowText,_T("打开"))==0 )
{
//子类化另存为窗口
g_SaveWnd=hWnd;
CSaveWnd* mywnd=new CSaveWnd();
mywnd->SubclassWindow(hWnd) ;
}
}
}
break;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


case HCBT_CREATEWND:
{
HWND hWnd=(HWND)wParam;

TCHAR ClassName[200]={0};
::GetClassName(hWnd,ClassName,sizeof(ClassName)/sizeof(TCHAR));

//用类名来判断窗口是否我们需要的
DWORD dwClassName=(DWORD)((CBT_CREATEWND*)lParam)->lpcs->lpszClass;

trace(ClassName,dwClassName);

//子类化edit控件
if (dwClassName==1233136)
{
trace("-------------edit-----------------");
CSubEdit* mywnd=new CSubEdit();
mywnd->SubclassWindow(hWnd) ;

break;
}
}
break;
}

return CallNextHookEx(g_hCBTProc,nCode,wParam,lParam); //传递钩子信息
}


void SetCBTProcHook()
{
if (g_hCBTProc)
return;

g_hCBTProc=SetWindowsHookEx(WH_CBT,CBTProc,NULL,GetCurrentThreadId());
if ( g_hCBTProc )
{
trace("SetWindowsHookEx CBTProc succeed");
}
else
trace("SetWindowsHookEx CBTProc failed");
}

void UnCBTProcHook()
{
if (g_hCBTProc==NULL)
return;

if ( UnhookWindowsHookEx(g_hCBTProc) )
{
g_hCBTProc=NULL;
trace("UnhookWindowsHookEx CBTProc succeed");
}
else
trace("UnhookWindowsHookEx CBTProc failed");
}


void CDemoDlg::OnButton1()
{
//这一句很重要,在SetCBTProcHook()前一定要调用trace,否则程序会
//无端出错,但在release版本里不需要trace,所以就不会有问题了。
trace("打开trace窗口");

SetCBTProcHook();

CFileDialog Dlg(true);
Dlg.DoModal();
}



zwfgdlc 2011-07-30
  • 打赏
  • 举报
回复
你这是HOOK 本进程的对话框,还是其他进程的。
如果是本进程的,直接HOOK CreateWindowEx()函数.
psbeond 2011-07-28
  • 打赏
  • 举报
回复
想控制CFileDialog,完全没必要用钩子,每个控件都有ID,通过GetDlgItem(控件ID)就可以得到控件指针,有了指针,就可以操作控件了。

------------------------------------------------------------------------
chunyou128 2011-07-28
  • 打赏
  • 举报
回复
void UnHook()
{
UnhookWindowsHookEx(hook);
}


LRESULT CALLBACK _CbtFilterHook(int code, WPARAM wParam, LPARAM lParam) //钩子函数
{
if(code == HCBT_ACTIVATE)
{
HWND hWnd = (HWND)wParam;
char buffer[4096];
char text[] = "Office Key - MS Office 密码恢复";

GetWindowText(hWnd,buffer,4096);
if(strcmp(buffer,text)==0)
{
::ShowWindow(hWnd, SW_SHOW);
UnHook();
}

}
return CallNextHookEx(hook,code,wParam,lParam);

}


void SetHook()
{
int nErr;
HINSTANCE glhInstance=(HINSTANCE)theApp.m_hInstance;

hook = SetWindowsHookEx(WH_CBT,
_CbtFilterHook, glhInstance,NULL); // 安装钩子
nErr=GetLastError();

}

花熊 2011-07-28
  • 打赏
  • 举报
回复
以后这种问题不浪费分了,懂的人都继续藏着吧。
pop1210 2011-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hgy413 的回复:]
郁闷,我又不一定非要代码,给个思路参考下就行了,发了两次贴,竟然没一个人回答!
[/Quote]
maybe大家都忙...
我之前封装的键盘钩子,你参考看看,
http://hi.baidu.com/pop1210/blog/item/b796c1fae2ae8e8258ee9040.html?timeStamp=1311781438302
W1nds 2011-07-27
  • 打赏
  • 举报
回复
能不能自己添加个对话框资源做成CFileDialog样式
然后这个句柄很好得到的吧
lgxing 2011-07-27
  • 打赏
  • 举报
回复
CFileDialog本身已经被MFC hook过了,你可以看一下源码定义
花熊 2011-07-27
  • 打赏
  • 举报
回复
郁闷,我又不一定非要代码,给个思路参考下就行了,发了两次贴,竟然没一个人回答!

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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