利用剪贴板实现屏幕截词.docx_第1页
利用剪贴板实现屏幕截词.docx_第2页
利用剪贴板实现屏幕截词.docx_第3页
利用剪贴板实现屏幕截词.docx_第4页
利用剪贴板实现屏幕截词.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

利用剪贴板实现屏幕截词 尽管Windows系统中提供了诸多剪贴板管理功能函数,但这些功能函数一般情况下都是在普通应用程序中使用。对于一些常居顶层的高级中英文软件,要想通过剪贴板实现屏幕截词,在选择要截取的数据后必须通过CTRLX或CTRLC功能键将数据复制到剪贴板,然后才能利用GetClipboard和GetClipboardData函数截获屏幕上数据。我们知道,Windows应用程序中对剪贴板的支持,主要是通过直接处理以下剪贴消息来实现的:WMCOPY 将选择的数据拷贝到剪贴板中去(CTRLC)WMCUT 将选择的数据拷贝到剪贴板,同时删除(CTRLX)WMCLEAR 清除系统剪贴板中保存的剪贴数据WMPASTE 将系统剪贴板中的数据复制到窗口当前位置所有Windows应用程序均支持以上消息处理功能,惟一不同的是一些应用程序中包括多级窗口,处理上述剪贴板消息的窗口有所不同,有些应用程序中可能在父窗口中处理剪贴板消息,而有些应用程序中可能在子窗口中处理剪贴板消息。于是,可以通过遍历应用程序窗口句柄的方法,将WMCOPY 消息通过SendMessage或PostMessage函数直接发送给拥有剪贴板消息处理功能的窗口,Windows就会自动将选择的数据复制到系统剪贴板,这时高级应用程序就可以直接截取选择的数据了,从而实现屏幕截词功能。Windows提供了一系列窗口管理API 功能函数,与本文功能有关的函数如下:1.获取当前具有输入高亮条窗口的句柄HWND GetFocus()函数的返回值为当前具有输入高亮条的窗口句柄,如果返回值为NULL则表示当前不存在具有输入高亮条的窗口。2.获取当前指定窗口父窗口句柄HWND GetParent(HWND hWnd)其中hWnd为当前窗口句柄,返回值为当前窗口的父窗口句柄,如果返回值为NULL,则表示当前窗口没有父窗口。3.获取与指定窗口相关窗口的句柄HWND GetWindow(HWND hWnd,UINT fnRel)该函数用来检索与给定窗口有关的窗口句柄,函数搜索系统的顶层窗口列表,返回与窗口有关的所有子窗口或所有同级窗口的句柄。其中hWnd为标识原始窗口的句柄,fnRel 指定返回窗口与原始窗口之间的关系,可以是下列参数值之一:(1)GWCHILD 标识窗口的第一个子窗口(2)GWHWNDFIRST返回窗口的第一个兄弟窗口,如果不存在则返回列表中的第一个顶层窗口(3)GWHWNDLAST 返回窗口的最后一个兄弟窗口,如果不存在则返回列表中的最后一个顶层窗口(4)GWHWNDNEXT 返回列表中紧跟给定窗口的兄弟窗口(5)GWHWNDPREV 返回列表中当前窗口的前一个兄弟窗口(6)GWOWNER 返回当前窗口的拥有者窗口句柄函数的返回值为取得的窗口句柄,如果返回值为NULL表示fnRel参数无效、系统的窗口列表结束、当前窗口不存在子窗口或拥有者。利用上述三个函数,就可以遍历整个应用程序窗口,从而实现截取数据的消息WMCOPY 的所有发送过程。但有一点需要提醒读者注意的是,如果要保存剪贴板中原来的数据内容,在发送WMCOPY 消息前必须将剪贴板中的数据保存,当WMCOPY 消息发送结束并正确读取剪贴板中数据之后,再恢复原有数据,使软件功能达到尽善尽美。至于剪贴板中数据的读取功能,其实现过程并不复杂,主要是一个打开、读取和关闭的过程。有关函数的原形如下:1.打开剪贴板HANDLE OpenClipboard(HWND hWnd)其中hWnd为打开剪贴板的窗口句柄,返回值为TRUE表示打开成功,否则剪贴板打开失败。2.取得剪贴板数据控制句柄HANDLE GetClipboardData(UINT Form)其中Form为剪贴板数据格式,CFTEXT为文本数据格式,也可以是图形数据格式或其它定义的数据格式,这里只讨论与本文程序功能相关的文本格式;返回值为剪贴板数据的内存控制句柄,如果为NULL表示地址无效。3.内存控制句柄加锁LPvoid GlobalLock(HANDLE Hand)其中Hand为内存控制句柄,其返回值为指向内存控制句柄所在的特定数据格式的指针,LPvoid中的void可根据实际需要来确定,可以是BYTE和WORD等数据格式,上述获取的剪贴板数据内存控制句柄只有在加锁后方能读取内存中的数据。4.内存控制句柄解锁void GlobalUnlock(HANDLE Hand)其中Hand为被加锁的内存控制句柄。内存数据读取结束后必须将其解锁,其它应用程序才能再次操作相同内存数据。5.关闭系统剪贴板void CloseClipboard(void)剪贴板数据读取结束后,必须利用这个函数关闭系统剪贴板。由于篇幅所限,下面仅给出通过剪贴板实现屏幕截词功能的主要函数,即直接遍历发送WMCOPY命令函数。void SendClip() HWND dWnd,zWnd,zWnd1;dWnd=GetFocus();if(dWnd!=NULL) SendMessage(dWnd,WMCOPY,0,0L); while(zWnd=GetParent(dWnd)!=NULL) if(zWnd=dWnd) break; else dWnd=zWnd; if(dWnd!=NULL) SendMessage(dWnd,WMCOPY,0,0L); zWnd=GetWindow(dWnd,GWCHILD); if(zWnd!=NULL) SendMessage(zWnd,WMCOPY,0,0L); dWnd=zWnd; zWnd1=GetWindow(dWnd,GWCHILD); if(zWnd1!=NULL) SendMessage(zWnd1,WMCOPY,0,0L); while(dWnd=GetWindow(zWnd1,GWHWNDNEXT)!=NULL) if(zWnd1=dWnd) break; else zWnd1=dWnd; SendMessage(zWnd1,WMCOPY,0,0L); while(dWnd=GetWindow(zWnd,GWHWNDNEXT)!=NULL) if(zWnd=dWnd) break; else zWnd=dWnd; SendMessage(zWnd,WMCOPY,0,0L); zWnd1=GetWindow(dWnd,GWCHILD); if(zWnd1!=NULL) SendMessa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论