{S0}简介
我搜索互联网上的一个简单的方法来实现一个AppBar(桌面应用程序的工具栏),但很多次都没有成功。微软提供了一些像SHAppBarMessage(A3})WINAPI shell函数。我尝试过了,但是这不是我的预期,因为壳牌AppBars重组桌面到合适的工具栏,而我想要一个滑杆,不干扰其他应用程序窗口或桌面上的图标。
所以,我已经开发了一个单一的MFC对象,CAppBarMngr,与应用程序的源代码最小的变化,让几乎所有的应用程序成为一个滑动AppBar。既然是必要的回应以外的应用程序窗口的鼠标动作,我不得不实施一个全球性的鼠标钩子,这就需要生成一个DLL,但你没有DLL的内部处理,只是为了与您的软件分发。整体设计
是一类:CAppBarMngr,将负责为从桌面屏幕的左边缘或右边缘的滑动应用程序的主框架。正如我刚才所说,是一个全局钩子需要作出适当反应的鼠标光标的位置(即侧缘已达到)。
传统,一个全局钩子是实施,发送通过其HWND的处理程序(钩子的DLL可以不被MFC的启用),需要在应用程序代码的几个修改接收和管理的钩子消息的消息应用程序的窗口的DLL 。然而,为了避免这种情况,我已经尝试过不同的方法:将消息发送到辅助线程,如下所述。CAppBarMngr类
这个类是从CWinThread派生,所以它能够接收邮件的发送使用WINAPI PostThreadMessage()函数,通过实施的PreTranslateMessage()事件。另外这个类有一些其他方面的职责:将钩子DLL的包装,并处理窗口移动(滑动)。
CAppBarMngr只有一个公共成员:init()函数。它将被用于链接与管理的窗口管理器。在源代码中所述,它有三个参数:
如何使用它//------------------------------------------------------
// Function: Init - Loads DLL functions and initilize mouse hook
// Arguments: _hWnd - Handler of window to manage
// _width - Desired width of managed window
// _left - True if window is left side docked, false if right sided
// Returns: APPBARHOOK_DLLERROR - An error has occurred while loading DLL functions
// APPBARHOOK_ALREADYHOOKED - Another instance has already hooked the mouse
// APPBARHOOK_SUCCESS - All is OK
//---------------------------------------------------------------------
int CAppBarMngr::Init(HWND _hWnd, int _width, bool _left)
这是所有你所要做的,落实到你的应用程序AppBar的:插入您的MFC项目的AppBarMngr.cpp和AppBarMngr.h文件。放上#包括"AppBarMngr.hquot;到您的主文件(创建主窗口)。创建你的主窗口,通常分为yourapp::InitInstance()中。创建一个MFC线程:AfxBeginThread()函数如下所示,保存一个指向它的指针。调用init方法,指定窗口的HWND的处理程序,所需的宽度和边缘。验证如果init成功返回。
下面是演示应用程序的代码部分:{C}
这是所有你必须做的。另外,不要忘记您的可执行应用程序分发的钩子DLL(AppBarHook.dll),它必须驻留在同一目录中才能正常工作。为免单实例的控制
作为运行两份相同AppBar计划的,它是没有意义的,init()函数是一个钩子已经使用(返回APPBARHOOK_ALREADYHOOKED)的通知,因此,您可以使用它,以避免第二个实例运行。请注意在上面的例子最后几行,如果已经使用挂钩,然后它返回FALSE来关闭应用程序。挂钩项目
我要开发一个项目,以实现全局鼠标钩子DLL。它只有一个文件:AppBarHook.cpp。我不想让一个钩子教程在这里,因为有几个伟大的文章在CodeProject。所以,我只会给你的一些细节。
通常的钩子技术节省了钩消息的接收窗口的窗口处理程序(HWND)。我用一个线程ID,而不是,那为什么CAppBarMngr是一个线程对象。因此,消息是通过使用WINAPI::SendThreadMessage(),而不是::SendMessage()的功能。
钩子将检测CAppBarMngr可能感兴趣的鼠标事件。我说,可能因为钩子不知道窗口状态和位置,它知道只有约的管理优势和窗口的宽度。 MFC类会做剩下的工作。
钩子DLL出口只有一个功能:SetHook(),它创建的全局鼠标钩子,并节省所需的宽度和边缘。这就是所谓的CAppBarMngr。关于演示应用
我已经创建了一个简单的演示应用程序项目,用于测试目的。它没有框架,标题,菜单或边境,有一个简单的CFrameWnd的派生对象。我已经测试没有任何问题,这与其他标准的MFC窗口。
演示源是一个Visual C + + 6.0项目,但您将能够打开并自动转换成一个较新的Visual C版本。
如果您发现此应用程序中的任何错误,请不要在意它。这只是用于演示目的,它不是本文的意图。出于同样的原因,我不会形容其内部。。NET版本
我已要求这种控制的。NET版本几次。我已经开始工作。我会在下面的论坛留下的消息时,它已准备好。历史2005年5月3 - 第一版2008年7月9日 - 增加了多显示器支持