📄 9926.txt
字号:
BOOL bResult=FALSE;
if(glhHook)
bResult= UnhookWindowsHookEx(glhHook);
if(bResult)
glhPrevTarWnd=NULL;
glhDisplayWnd=NULL;//清变量
glhHook=NULL;
}
}
return bResult;
}
(9)钩子函数的实现:
LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;
if (nCode>=0)
HWND glhTargetWnd=pMouseHook->hwnd;
file://取目标窗口句柄
HWND ParentWnd=glhTargetWnd;
while (ParentWnd !=NULL)
glhTargetWnd=ParentWnd;
ParentWnd=GetParent(glhTargetWnd);
file://取应用程序主窗口句柄
}
if(glhTargetWnd!=glhPrevTarWnd)
char szCaption[100];
GetWindowText(glhTargetWnd,szCaption,100);
file://取目标窗口标题
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
glhPrevTarWnd=glhTargetWnd;
file://保存目标窗口
}
}
return CallNextHookEx(glhHook,nCode,wparam,lparam);
file://继续传递消息
}
(10)编译项目生成mousehook.dll。
2.创建钩子可执行程序
(1)用MFC的AppWizard(EXE)创建项目Mouse;
(2)选择“基于对话应用”并按下“完成”键;
(3)编辑对话框,删除其中原有的两个按钮,加入静态文本框和编辑框,用鼠
标右键点击静态文本框,在弹出的菜单中选择“属性”,设置其标题为“鼠标所
在的窗口标题”;
(4)在Mouse.h中加入对Mousehook.h的包含语句#Include"..\Mousehook\Mou
sehook.h";
(5)在CMouseDlg.h的CMouseDlg类定义中添加私有数据成员:
CMouseHook m_hook;//加入钩子类作为数据成员
(6)修改CmouseDlg::OnInitDialog()函数:
BOOL CMouseDlg::OnInitDialog()
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);//Set big icon
SetIcon(m_hIcon, FALSE);//Set small icon
file://TODO: Add extra initialization here
CWnd * pwnd=GetDlgItem(IDC_EDIT1);
file://取得编辑框的类指针
m_hook.starthook(pwnd->GetSafeHwnd());
file://取得编辑框的窗口句柄并安装钩子
return TRUE;
file://return TRUE unless you set the focus to a control
}
(7)链接DLL库,即把..\Mousehook\debug\Mousehook.lib加入到项目设置链
接标签中;
(8)编译项目生成可执行文件;
(9)把Mousehook.DLL拷贝到..\mouse\debug目录中;
(10)先运行几个可执行程序,然后运行Mouse.exe程序,把鼠标在不同窗口中
移动,在Mouse.exe程序窗口中的编辑框内将显示出鼠标所在的应用程序主窗口的
标题。pcc
****************************************************************
VFP中多媒体数据的高效处理技巧
(河北 朱运喜)
一. Visual FoxPro中应用OLE技术所存在的问题
Visual FoxPro(以下简称VFP) 是一种数据库应用程序开发系统,可利用
OLE技术实现对象的链接与嵌入,为应用开发提供了广阔的空间。虽然VFP提供
的OLE编程方式简单快捷,但在实际运行VFP程序的过程中,发现使用OLE方式
处理多媒体数据运行效果并不理想,其原因在于:
1.运行速度慢
在VFP中利用OLE方法处理多媒体数据,访问磁盘的次数明显增加。由于
频繁地读取磁盘数据,使得用户操作有明显的等待时间。
2.重复占用磁盘空间
我们可以用General字段建立一个多媒体数据库, 观查其大小的变化。
在进行多媒体数据入库操作后,发现备注文件(.FPT)的生成长度略大于原
文件(.BMP、.WAV、.AVI)长度,且有些操作不能删除原文件,造成重复占
用磁盘使用空间。
二. VFP中高效多媒体程序的设计与实现
为简化多媒体数据的管理, 提高多媒体信息的输出速度,笔者对VFP中
多媒体信息处理功能、外部应用程序接口、WINDOWS 的多媒体动态链接库进
行了充分的研究,终于找到一种简单有效的实现方法。
首先建立一多媒体数据库 PLAY. DBF , 设有三个字符型字段: BMPFILE、
WAVFILE、 AVIFILE,分别用于存放图片文件名(.BMP )、声音文件名(.WAV)
和视频文件名(.AVI)。
1.图片文件的快速处理
快速方法:充分利用VFP引入的图形控件及其PICTURE属性。
程序处理过程:
(1)建立表单FORM,放入图形控件IMAGE1,添加PLAY.DBF至表单的数据环境。
(2)程序清单:
THISFORM.IMAGE1.PICTURE=PLAY.BMPFILE
THISFORM.REFRESH()
该程序在运行过程中,随着数据库指针的移动,图形控件IMAGE1将随之
实现图片的快速刷新显示。
2.实现数字视频文件的快速播放
虽然VFP处理视频文件的功能较弱,但作为 VFP 运行基础的WINDOWS系
统却提供了上百个具有多媒体处理能力的API函数,并统一由多媒体动态链
接库提供给开发者使用。 多媒体动态链接库所在目录及库名在不同的系统
中略有不同,在WINDOWS3.2和WINDOWS 95中,为\WINDOWS\SYSTEM\MMSYSTEM.DLL,
在WINDOWS NT中,则为\WINDOWS\SYSTEM32\WINMM.DLL。
在VFP中,为调用多媒体动态链接库中的API函数,提供了一个外部应
用程序接口库文件FOXTOOLS. FLL 。其中有两个重要的函数:REGFN( )和
CALLFN( )。前者用来寄存驻留在WINDOWS的动态链接库中的API函数及其参
数。后者则用以调用执行WINDOWS 的 API 函数。调用格式:=REGFN(“函
数名”,“传给函数的参数类型、数量”,“函数返回值的数据类型”,“DLL库名”)
返回参数:调用成功REGFN( )返回一个数值,否则返回-1。
=CALLFN ((REGFN( )的返回值,参数1,参数2……)
注意:
(1)在CALLFN()中说明的参数数目、类型必须与在REGFN( )中指定
的参数相符,否则调用失败。
(2)在VFP5.0中,针对32位系统提供了调用REGFN32()。
(3)对REGFN() 和CALLFN()中双引号内的字符串应注意大小写的混
合写法,否则可能会引起执行错误。
例:本例仅给出视频操作部分的程序代码,省略了其它相关部分的
程序代码。
(1) FORM.INIT事件中的程序代码:
set library to HOME()+foxtools.fll ADDITIVE
public playfavi
playfavi=regfn(“MCISendString”,“CCII”,“I”,“MMSYSTEM”)
(2)OPEN.CLICK(打开视频文件操作)程序代码:
avifname=play.avifile
=callfn(playfavi,“Open &avifname alias AVI Type AVIVideo ”,“”,0,0)
=callfn(playfavi,“put AVI window at 160 100 320 240”,“”,0,0)
thisform.Refresh()
说明:160,100为窗口左上角坐标,320,240为窗口大小,也可用坐标
变量的方式确定视频播放窗口的位置及大小。
(3)PLAY.CLICK(播放AVI文件操作)程序代码:
=callfn(playfavi,“Play AVI”,“”,0,0)
(4)TOP.CLICK(回到片头操作,即影片的第一帧)程序代码:
=callfn(playfavi,“SEEK AVI TO START”,“”,0,0)
(5)END.CLICK(转到片尾操作,即影片的最后一帧)程序代码:
=callfn(playfavi,“SEEK AVI TO END”,“”,0,0)
(6)CONFIG.CLICK(显示视频处理配置操作)程序代码:
=callfn (playfavi,“configure avi”,“”,0,0)
(7)CLOSE.CLICK(关闭视频文件操作)程序代码:
=callfn(playfavi,“close AVI”,“”,0,0)
3.声音文件的处理技巧
VFP处理声音文件的方式除OLE外,还可用编程方法控制播放.WAV文
件具体方法:
SET BELL TO PLAY.WAVFILE,WAV
??CHR(7)
用此方法处理声音文件虽然快捷简单, 但无法通过键盘或鼠标中断
WAV文件的播放。为解决此问题,笔者事先用WINDOWS的RECORDER录制了一
个“静音文件”SILENCE.WAV, 即没有任何声音的声音文件,同时在表单
中设置“停止播放”的命令按钮,其CLICK代码段为:
SET BELL TO “SILENCE.WAV”,WAV
??CHR(7)
操作者可通过“停止播放”按钮中断声音的播放。
上述程序在WINDOWS 95环境中,分别用VFP5.0、VFP6.0调试通过。
采用以上方法(非OLE 方式)处理多媒体数据不仅能简化数据库管
理(仅对各种媒体的文件名进行管理即可),节省了大量的存储空间,
还可以提高多媒体信息的处理速度,并且编程简单,易于实现。
****************************************************************
VFP中图形特技的实现
(四川 周鸣扬)
在使用VFP进行多媒体演示程序设计时,为了让你的程序看起来更加引
人注意,经常涉汲到对图形的特技处理。但是,由于VFP提供的图形操作函
数少得可怜,远不如VB和VC那样丰富,除了画点、矩形、圆之外,再也难
以找到其他的绘图函数了。如何在现有的条件下充分利用VFP的自身环境作
出令人满意的图形特技呢?以下是我在平时设计程序的一些小经验,可供
大家参考。
一、 图形画卷式地展开以及由小到大地平推式放大特技
在VFP中,可以使用Image图形控件的Width及Height属性来让图片从左
至右、从上到下地逐渐展开。具体的作法是:先新建一表单Form1,在上面
分别加上Image和Timer控件,名称为Image1、Timer1,然后在Form1的Init
事件中加入如下代码:
Local Pwidth,Pheight
*设置欲展开的图片
thisform.image1.picture=“c:\windows\安装程序.bmp”
thisform.image1.stretch=0
*设置计时器
thisform.timer1.interval=20
pwidth=thisform.image1.width
pheight=thisform.image1.height
*让表单与图形一样大小
thisform.width=Pwidth
thisform.height=Pheight
*首先隐藏图片,以备展开
thisform.image1.top=0
thisform.image1.left=0
thisform.image1.height=0
*打开计时器
thisform.timer1.enabled=.t.
接下来在Timer1的Timer事件中加入下述代码:
*设定图形展开的幅度,幅度过大会产生闪烁的效果
thisform.image1.height=thisform.image1.height+1
if thisform.image1.height>Pheight
this.enabled=.f.
endi
运行Form1,你将会看到一幅画由上至下逐渐展开。需要注意的是,
之所以在Form1的Init事件中设定Image1的stretch属性为0(对图形进行
剪裁)是因为如果将stretch属性设为1(等比填充)或是2(变比填充),
你看到的只是一幅画由小逐渐变大,而非是逐渐展开。也许你会问怎样实
现图形平推式放大,我想不必再多说了,设定stretch属性为1或2 ,在
Form1的Init事件中正确设定图形的初始位置(表单的中央)以及在
Timer1的Timer事件中不断调整图形的显示位置(修改Image1的Left、Top
值)和图片大小(Width、Height),怎么样?试试吧,很有趣的。
二、 图形的雾化及滤色处理
图形的雾化处理就是让一幅画看起来朦朦胧胧的。在VFP中由系统提
供图形处理函数相当少,这时我们可以使用一种比较笨的办法来实现雾
化处理。在VFP中我们可以利用表单的画圆函数在表单上画圆,对于所绘
图形在表单上的存在形式,这是通过表单的Drawmode 属性来控制。对图
形进行雾化处理,既要在图画上添加“雾”的颜色,同时也得保留图形
的本来面目,这时很自然地想到图形之间的“掩码”操作,将Drawmode设
为9(掩码操作)即可完成对图形的雾化操作。同样建立一表单Form1,在
其Init事件中加入如下代码:
thisform.picture=“c:\windows\安装程序.bmp”
*设定“雾的颜色”
thisform.forecolor=rgb(192,192,192)
thisform.refresh
另外在Form1的Dblcilck事件中加入如下代码:
local temp,pradius,x,y,x1,y1
temp=1
thisform.picture=“c:\windows\安装程序.bmp”
thisform.refresh
wait window “按任一键进行雾化演示”
*利用两点间距离公式计算圆的最大半径
x=thisform.width/2
y=thisform.height/2
x1=thisform.left
y1=thisform.top
pradius=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1))
*由内向外画圆,实现雾化
do while temp thisform.circle(temp,thisform.width/2,thisform.height/2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -