📄 subject_23907.htm
字号:
<p>
序号:23907 发表者:李 发表日期:2002-12-07 16:21:46
<br>主题:接热键问题:如何获得“ctrl+c”复制的文本内容?
<br>内容:现在选一段文本内容按“ctrl+c”后应用程序激活,并弹出对话框,框里有一个编辑框,如何将刚才复制的文本内容显示在编辑框里?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:太平冰水 回复日期:2002-12-07 17:27:32
<br>内容:现在选一段文本内容按“ctrl+c”后,系统将其放在剪贴板了,你可以从剪贴板得到他们
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:李 回复日期:2002-12-07 19:24:47
<br>内容:但是ctrl+c已经是热键,原来的复制功能还有没有?又怎样判断被复制的是文本内容而不是其他如文件夹,我想要实现只在文本内容上按<BR>ctrl+c时才激活应用程序,并将刚才复制的文本内容显示在编辑框里,<BR>怎样才能实现啊?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:太平冰水 回复日期:2002-12-07 22:34:31
<br>内容:我还以为你的窗口已经探出了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:李 回复日期:2002-12-08 14:04:51
<br>内容:大家帮我看看啊。。。。。。。。。。。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Arthur 回复日期:2002-12-10 16:34:19
<br>内容:帮你顶!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:阿蝌 回复日期:2002-12-11 12:43:34
<br>内容:我也想知道如何实现Ctrl+C的功能!!!<BR>顶啊
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:沧鹰 回复日期:2002-12-11 17:31:08
<br>内容:看看这两篇文章,希望对你有所帮助。<BR><BR>1.如何在VC++6.0中定义热键消息 <BR> <BR> 消息是windows操作系统和应用程序之间进行通信的载体,操作系统将包括用<BR>户在内的各种事件以消息的形式发送至目标,目标系统再根据消息具体的内容进<BR>行相应的处理。<BR> 在VC++6.0中,大多数的窗口消息可以从ClassWizard中找到,但是一些不<BR>常用的消息在ClassWizard中并没有封装,比如热键处理消息(WM_HOTKEY),用<BR>户必须事先定义热键,然后不论该程序在前台或后台运行,只要用户按下了这个<BR>热键,该程序就会立即在前台运行,并收到热键消息,消息处理函数执行热键中<BR>定义的操作。要实现这些功能,用户必须在代码级进行工作,也就是说要手工编<BR>写代码。具体步骤如下:<BR> 假设用户已经用AppWizard生成了一个单文档界面框架,在工程中主要有下列<BR>几个文件,向导为应用程序创建了如下类:<BR> CtestView CtestDoc CtestApp CmainFrame CAboutDlg<BR> 请按下列步骤进行:<BR> 1、在视图类的声明文件中,即testview.h文件中,找到消息映射的声名处,<BR>在下列语句处加入热键处理函数声明:(划线部分)<BR> //{{AFX_MSG(CTestView)<BR> afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);<BR> //}}AFX_MSG<BR> LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);<BR> DECLARE_MESSAGE_MAP()<BR> 2、在视图类的实现文件,即TestView.cpp文件中,找到消息映射的定义处,<BR>这里是使函数和消息发生关联的地方,当发生某消息时,会调用这里定义的相应<BR>消息处理函数,也就是说用消息映射宏使消息与相应的处理函数发生关系。<BR><BR> 下面的语句说明WM_HOTKEY消息和OnHotkey函数发生关联。<BR> BEGIN_MESSAGE_MAP(CTestView, CView)<BR> //{{AFX_MSG_MAP(CTestView)<BR> ON_WM_CREATE()<BR> //}}AFX_MSG_MAP<BR> // Standard printing commands<BR> ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)<BR> ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)<BR> ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)<BR> ON_MESSAGE(WM_HOTKEY,OnHotkey) //消息和函数发生关联<BR> END_MESSAGE_MAP()<BR> 3、在OnCreate函数中加入初始化代码,向系统登记热键。<BR> RegisterHotKey(hWnd,1001,MOD_CONTROL|MOD_ALT,&lsquo;z&rsquo;);<BR> RegisterHotKey(hWnd,1002,MOD_CONTROL|MOD_ALT,&lsquo;Z&rsquo;);<BR> 本例中定义的热键为Ctrl+Alt+z。<BR> 4、在OnHotkey()处理函数中处理热键,即检查是否是所期望的热键,如果是<BR>,这里为了简单,弹出一个对话框,显示&ldquo;You Press Ctrl+Alt+z(Z)&rdquo;。<BR> LRESULT CTestView::OnHotkey(WPARAM wParam,LPARAM lParam)<BR> {<BR> if(wParam==1001||wParam==1002)<BR> MessageBox(&ldquo;You Press Ctrl+Alt+z(Z)&rdquo;);<BR> return 0;<BR> }<BR> 注意:OnHotkey()函数必须有返回值。<BR> 5、最后,不要忘了在OnDestroy()函数中解除函数登记,释放系统资源。<BR> UnregisterHotKey(m_hWnd,1001);<BR> UnregisterHotKey(m_hWnd,1002);<BR> 这样程序运行后,无论程序在前台或后台运行,只要你按下Ctrl+Alt+z,就<BR>会执行热键处理函数中的代码,这里弹出对话框。读者可以自行在自己的热键处<BR>理函数中加入需要的代码来完成特定的功能。<BR><BR><BR>2.利用剪贴板实现屏幕截词<BR><BR> 尽管Windows系统中提供了诸多剪贴板管理功能函数,但这些功能函数一般情<BR>况下都是在普通应用程序中使用。对于一些常居顶层的高级中英文软件,要想通<BR>过剪贴板实现屏幕截词,在选择要截取的数据后必须通过CTRL+X或CTRL+C功能<BR>键将数据复制到剪贴板,然后才能利用GetClipboard和GetClipboardData函数截<BR>获屏幕上数据。<BR><BR> 我们知道,Windows应用程序中对剪贴板的支持,主要是通过直接处理以下剪<BR>贴消息来实现的:<BR><BR> WM—COPY 将选择的数据拷贝到剪贴板中去(CTRL+C)<BR><BR> WM—CUT 将选择的数据拷贝到剪贴板,同时删除(CTRL+X)<BR><BR> WM—CLEAR 清除系统剪贴板中保存的剪贴数据<BR><BR> WM—PASTE 将系统剪贴板中的数据复制到窗口当前位置<BR><BR> 所有Windows应用程序均支持以上消息处理功能,惟一不同的是一些应用程序<BR>中包括多级窗口,处理上述剪贴板消息的窗口有所不同,有些应用程序中可能在<BR>父窗口中处理剪贴板消息,而有些应用程序中可能在子窗口中处理剪贴板消息。<BR>于是,可以通过遍历应用程序窗口句柄的方法,将WM—COPY 消息通过<BR>SendMessage或PostMessage函数直接发送给拥有剪贴板消息处理功能的窗口,<BR>Windows就会自动将选择的数据复制到系统剪贴板,这时高级应用程序就可以直接<BR>截取选择的数据了,从而实现屏幕截词功能。<BR><BR> Windows提供了一系列窗口管理API 功能函数,与本文功能有关的函数如下:<BR><BR> 1.获取当前具有输入高亮条窗口的句柄HWND GetFocus()<BR><BR> 函数的返回值为当前具有输入高亮条的窗口句柄,如果返回值为NULL则表示<BR>当前不存在具有输入高亮条的窗口。<BR><BR> 2.获取当前指定窗口父窗口句柄<BR><BR> HWND GetParent(HWND hWnd)<BR><BR> 其中hWnd为当前窗口句柄,返回值为当前窗口的父窗口句柄,如果返回值为<BR>NULL,则表示当前窗口没有父窗口。<BR><BR> 3.获取与指定窗口相关窗口的句柄<BR><BR> HWND GetWindow(HWND hWnd,UINT fnRel)<BR><BR> 该函数用来检索与给定窗口有关的窗口句柄,函数搜索系统的顶层窗口列表<BR>,返回与窗口有关的所有子窗口或所有同级窗口的句柄。其中hWnd为标识原始窗<BR>口的句柄,fnRel 指定返回窗口与原始窗口之间的关系,可以是下列参数值之一<BR>:<BR><BR> (1)GW—CHILD 标识窗口的第一个子窗口<BR><BR> (2)GW—HWNDFIRST返回窗口的第一个兄弟窗口,如果不存在则返回列表中的第一个顶层窗口<BR><BR> (3)GW—HWNDLAST 返回窗口的最后一个兄弟窗口,如果不存在则返回列表中的最后一个顶层窗口<BR><BR> (4)GW—HWNDNEXT 返回列表中紧跟给定窗口的兄弟窗口<BR><BR> (5)GW—HWNDPREV 返回列表中当前窗口的前一个兄弟窗口<BR><BR> (6)GW—OWNER 返回当前窗口的拥有者窗口句柄<BR><BR> 函数的返回值为取得的窗口句柄,如果返回值为NULL表示fnRel参数无效、系<BR>统的窗口列表结束、当前窗口不存在子窗口或拥有者。<BR><BR> 利用上述三个函数,就可以遍历整个应用程序窗口,从而实现截取数据的消<BR>息WM—COPY 的所有发送过程。但有一点需要提醒读者注意的是,如果要保存剪贴<BR>板中原来的数据内容,在发送WM—COPY 消息前必须将剪贴板中的数据保存,当WM<BR>—COPY 消息发送结束并正确读取剪贴板中数据之后,再恢复原有数据,使软件功<BR>能达到尽善尽美。<BR><BR> 至于剪贴板中数据的读取功能,其实现过程并不复杂,主要是一个打开、读<BR>取和关闭的过程。有关函数的原形如下:<BR><BR> 1.打开剪贴板<BR><BR> HANDLE OpenClipboard(HWND hWnd)<BR><BR> 其中hWnd为打开剪贴板的窗口句柄,返回值为TRUE表示打开成功,否则剪贴板打开失败。<BR><BR> 2.取得剪贴板数据控制句柄<BR><BR> HANDLE GetClipboardData(UINT Form)<BR><BR> 其中Form为剪贴板数据格式,CF—TEXT为文本数据格式,也可以是图形数据<BR>格式或其它定义的数据格式,这里只讨论与本文程序功能相关的文本格式;返回<BR>值为剪贴板数据的内存控制句柄,如果为NULL表示地址无效。<BR><BR> 3.内存控制句柄加锁<BR><BR> LPvoid GlobalLock(HANDLE Hand)<BR><BR> 其中Hand为内存控制句柄,其返回值为指向内存控制句柄所在的特定数据格<BR>式的指针,LPvoid中的void可根据实际需要来确定,可以是BYTE和WORD等数据格<BR>式,上述获取的剪贴板数据内存控制句柄只有在加锁后方能读取内存中的数据。<BR><BR> 4.内存控制句柄解锁<BR><BR> void GlobalUnlock(HANDLE Hand)<BR><BR> 其中Hand为被加锁的内存控制句柄。内存数据读取结束后必须将其解锁,其<BR>它应用程序才能再次操作相同内存数据。<BR><BR> 5.关闭系统剪贴板<BR><BR> void CloseClipboard(void)<BR><BR> 剪贴板数据读取结束后,必须利用这个函数关闭系统剪贴板。<BR><BR> 由于篇幅所限,下面仅给出通过剪贴板实现屏幕截词功能的主要函数,即直<BR>接遍历发送WM—COPY命令函数。<BR><BR> void SendClip()<BR><BR> { HWND dWnd,zWnd,zWnd1;<BR><BR> dWnd=GetFocus();<BR><BR> if(dWnd!=NULL){<BR><BR> SendMessage(dWnd,WM—COPY,0,0L);<BR><BR> while((zWnd=GetParent(dWnd))!=NULL){<BR><BR> if(zWnd==dWnd) break;<BR><BR> else dWnd=zWnd;}<BR><BR> if(dWnd!=NULL){<BR><BR> SendMessage(dWnd,WM—COPY,0,0L);<BR><BR> zWnd=GetWindow(dWnd,GW—CHILD);<BR><BR> if(zWnd!=NULL){<BR><BR> SendMessage(zWnd,WM—COPY,0,0L);<BR><BR> dWnd=zWnd;<BR><BR> zWnd1=GetWindow(dWnd,GW—CHILD);<BR><BR> if(zWnd1!=NULL){<BR><BR> SendMessage(zWnd1,WM—COPY,0,0L);<BR><BR> while((dWnd=GetWindow(zWnd1,GW—HWNDNEXT))!=NULL){<BR><BR> if(zWnd1==dWnd) break;<BR><BR> else zWnd1=dWnd;<BR><BR> SendMessage(zWnd1,WM—COPY,0,0L); } }<BR><BR> while((dWnd=GetWindow(zWnd,GW—HWNDNEXT))!=NULL){<BR><BR> if(zWnd==dWnd) break;<BR><BR> else zWnd=dWnd;<BR><BR> SendMessage(zWnd,WM—COPY,0,0L);<BR><BR> zWnd1=GetWindow(dWnd,GW—CHILD);<BR><BR> if(zWnd1!=NULL){<BR><BR> SendMessage(zWnd1,WM—COPY,0,0L);<BR><BR> while((dWnd=GetWindow(zWnd1,GW—HWNDNEXT))!=NULL){<BR><BR> if(zWnd1==dWnd) break;<BR><BR> else zWnd1=dWnd;<BR><BR> SendMessage(zWnd1,WM—COPY,0,0L); }}}}}}}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:阿蝌 回复日期:2002-12-11 17:53:22
<br>内容:顶
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:李 回复日期:2002-12-12 00:23:35
<br>内容:非常感谢z兄!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -