由于PouwerBuilder自身编程方面的限制,其语言本身不能对Windows任务栏进行操作,也不能对超出应用窗口之外的鼠标移动进行响应,从而影响了PowerBuilder编程的界面表现手法。下面通过Visual C++ 6.0将功能函数封装在PowerBuilder可调用的动态链接库中,实现了Windows 消息函数与PowerBuilder应用程序的交互,应用程序能对任务栏的图标操作进行反应,能捕捉到鼠标在计算机全屏幕的位置,从而实现应用程序窗口的自动显示和隐藏功能。读者通过阅读本文能够开拓PowerBuilder的编程思路,了解Visual c++的任务栏和钩子函数的编程方法。构建程序的主要步骤:
1. PowerBuilder中open事件
构建一窗口w_main(),在open事件中调用database.dll中的addicon和starthook函数, addicon在windows工具栏生成一个图标,starthook启用自定义钩子函数,截获对鼠标的处理。代码如下:
ls_tip="自动备份数据库"
li_rec=addicon(handle(this),1024,ls_tip)
//pbm_custom01的事件号为1024
starthook()
2. C++中addicon函数
所有自定义函数都在database.cpp中定义,addicon函数的核心代码如下:
HWND CDatabaseApp::addicon(HWND hwnd,UINT umsg,LPCSTR lptip)
{
BOOL bz;
NOTIFYICONDATA m_nid;
memset(&m_nid,0,sizeof(m_nid));
HICON hicon=NULL;
hicon=LoadIcon(IDI_ICON1);
m_nid.hIcon=hicon;//定义图标所显示的图像
m_nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
strncpy(m_nid.szTip,lptip,sizeof(m_nid.szTip));//设置图标的提示字符
m_nid.uCallbackMessage=umsg;
//图标激活时传递给pb窗口的自定义事件的事件号,本事件号为1024,对应于pb中的自定义事件selfshow,其event ID为pbm_custom01。当左击图标时,pb中的selfshow被执行。
m_nid.cbSize=sizeof(m_nid);
m_nid.hWnd=hwnd;//pb窗口指针,图标激活时调用该窗口中自定义事件selfshow
m_nid.uID=6911060;//图标的标识号
bz=Shell_NotifyIcon(NIM_ADD,&m_nid);
return (HWND)bz;
}
3. C++中的starthook函数
addicon函数的核心代码如下:
bool starthook()
{
hinstance=AfxGetInstanceHandle();
hHook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC) mouseproc,hinstance,0);
//安装一个钩子函数mouseproc用于监视鼠标消息
return (bool)hHook;
}
|