如何用钩子自定义PickIconDlg

Sample Image - PickIconDlg2.jpg 介绍 你可以看到我以前的文章显示选择图标对话框。我不只是更新了那篇文章,因为对于那些只想显示这个对话框的人来说,这是一个简单的解决方案。在本文中,我将定制这个对话框。实际上,这一切都始于我在一个项目上的工作,这需要我安装一个钩子DLL。因此,作为了解钩子如何工作的一个简单方法的开始,我创建了这个,它工作了。 变化 我所做的第一个改变是,现在它是一个简单的类,它封装了所有调用API、生成Unicode字符串并将其转换回来和挂钩。 连接的对话框 我想做的是在对话框中显示当前选择的图标的索引。为此,我想在对话框中放置另一个静态控件。但是我把静态控件放在哪里呢?首先,我试图缩小图标列表框,但没有成功。有关简短讨论,请参阅我的博客。然后我使实际对话框更高,并将按钮向下移动。对于所有这些,我设置了一个类型为WH_CALLWNDPROC的SetWindowsHookEx()钩子。在这个钩子的过程中,我进行了更改。我处理了两条消息WM_INITDIALOG和WM_COMMAND。 为什么钩 正如大多数人所见,大多数窗口对话框和其他类似的api都为我们提供了回调工具。这些是什么?回调是我们应用程序(DLL)中的一个函数,由Windows操作系统调用。为什么叫它?当为对话框设置回调时,在对话框的文档中会说明回调的目的。什么时候叫?这里也会提到。例如,SHBrowseForFolder对话框还提供了一种通过在BROWSEINFO中设置回调来点击它的方法。lpfn成员。设置这个回调之后,你就可以很容易地知道对话框中发生了什么。但是在PickIconDlg()的情况下,我没有这样的选项,这意味着这个对话框没有提供正确的方法来了解它的事件。这就是我钩住它的原因。 钩是如何工作的 钩子进程的工作并不是很困难,只要设置一个钩子,然后显示你想要钩住的对话框,记得在你完成后解除钩子,通常在对话框被解除后。在设置了一个钩子之后,它就像你为那个对话框设置了一个回调一样。在这个对话框的生命周期中,你可以看到这个对话框从创建到销毁的每一个事件。在那个被告知的钩子函数中,钩子被设置(这里CallWndProc()是将要被调用的函数)。 隐藏,复制Code

mhHook = SetWindowsHookEx(WH_CALLWNDPROC ,CallWndProc, NULL, AfxGetApp()->m_nThreadID);

您将收到该对话框的所有消息。现在,您需要处理哪些消息和忽略哪些消息。 消息处理 WM_INITDIALOG消息是我对对话框进行所有视觉改变的地方,我使对话框更高,然后移动按钮(有三个按钮,不是两个)。一个是隐藏的)下来,并把我新创建的静态列表框和按钮之间。 隐藏,复制Code

LRESULT CALLBACK CPickIconDialog::CallWndProc(int nCode,WPARAM wParam, LPARAM lParam)
{
	if (nCode < 0) // do not process message 
		return CallNextHookEx(mhHook, nCode, wParam, lParam);
	CWPSTRUCT *msg = (CWPSTRUCT *)lParam;
	switch(msg->message)
	{
	case WM_INITDIALOG:
	{
	// handle message here 

WM_COMMAND消息实际上只处理一个通知LBN_SELCHANGE,它在每次列表框中选择发生变化时发送。这里我更新了我的静态控件。 历史 2006年9月18日:最后更新 本文转载于:http://www.diyabc.com/frontweb/news10832.html

原文地址:https://www.cnblogs.com/Dincat/p/13473264.html