C# 如何获取鼠标选中文本内容

DAMMAD 2010-05-24 09:33:48
最近用C#写一个程序,先注册热键。然后鼠标可以在其他窗口比如explorer, word, notepad, iexplore, wordpad 等等能显示文字的窗口)上选中一些文本,然后摁下热键可以把内容复制下来。
发现这个问题有人发过了,例如 http://topic.csdn.net/u/20080601/12/7102db3f-457f-4607-bbed-7b83f8cfcfb4.html?seed=738220130&r=60344770#r_60344770 但是也不清楚意思。
我的思路也是先获取最前端窗体的句柄IntPtr hWnd = GetForegroundWindow();,然后调用API函数SendMessage(hWnd,WM_COPY,0,0);但是发现内容根本没被复制下来。

求大侠们提供解决方法。
...全文
1353 点赞 收藏 23
写回复
23 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yqb_last 2012-03-04
剪切板上的太随意了啊 有用钩子实现的吗 求教啊
回复
xkclub 2012-01-26
我也想知道你到底么样实现的,可以给看一下代码吗?
回复
请教您一下,您到底是怎么实现的呢~~
回复
Dobzhansky 2010-06-03
恭喜楼主
回复
DAMMAD 2010-06-03
感谢各位大侠的回答,问题也算是解决了,结贴给分。
回复
DAMMAD 2010-05-31
[Quote=引用 13 楼 yuanhuiqiao 的回复:]
加个选中即复制的功能?
[/Quote]
嗯 现在的思路就是这样。但是带来一个新问题,可以将在网页的文字复制到剪贴板,但是在代码里却取不出来。

IDataObject iData = Clipboard.GetDataObject();
if (null != iData)
{
if (iData.GetDataPresent(DataFormats.Text))) //检查是否存在文本
{
selectedText += (String)iData.GetData(DataFormats.Text);
} //SelectedText除了记事本能取到之外 其他窗体文字都取不到。
}
回复
siegebaoniu 2010-05-31
关注。
回复
skydhx 2010-05-28
这个问题蛮深奥 我都没看明白
回复
夏脑 2010-05-28
看一下xianao16888的博客
回复
yuanhuiqiao 2010-05-28
加个选中即复制的功能?
回复
wgc 2010-05-28
系统剪贴板不行吗?
回复
DAMMAD 2010-05-28
[Quote=引用 10 楼 fengling2001 的回复:]

需要注册全局钩子,至于监视ExtTextOut等函数,我觉得没有必要,就看你如何响应具体动作了,
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.……
[/Quote]
关键是endMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&data); 中data如何获取鼠标选中的文本,纠结~
回复
fengling2001 2010-05-25
需要注册全局钩子,至于监视ExtTextOut等函数,我觉得没有必要,就看你如何响应具体动作了,
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
回复
DAMMAD 2010-05-25
[Quote=引用 8 楼 fengling2001 的回复:]
引用 7 楼 dammad 的回复:

引用 1 楼 fengling2001 的回复:
SendMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&data);


我查下资料,发现在c++中,data的类型是COPYDATASTRUCT,在C#中找不到这个类型

自己重新定义下,看下c#下Win32 调用
[/Quote]
我现在对这个思路有点怀疑,网上有人说注册全局钩子,再监视ExtTextOut等函数获取鼠标选中内容,总之挺麻烦的,不知道这位大哥以前有做过这方面的工作没有,指定下方向。呵呵……
回复
fengling2001 2010-05-25
[Quote=引用 7 楼 dammad 的回复:]

引用 1 楼 fengling2001 的回复:
SendMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&data);


我查下资料,发现在c++中,data的类型是COPYDATASTRUCT,在C#中找不到这个类型
[/Quote]
自己重新定义下,看下c#下Win32 调用
回复
DAMMAD 2010-05-24
[Quote=引用 1 楼 fengling2001 的回复:]
SendMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&data);
[/Quote]

我查下资料,发现在c++中,data的类型是COPYDATASTRUCT,在C#中找不到这个类型
回复
DAMMAD 2010-05-24
[Quote=引用 2 楼 healer_kx 的回复:]
你应该用剪切板族的API了。
[/Quote]

问题是我必须先获取鼠标选中的内容才能复制,剪切板族有提供此功能么?
请不吝赐教
回复
DAMMAD 2010-05-24
[Quote=引用 3 楼 wuyq11 的回复:]
API操作
SendTxtMessage(hwdText, WM_SETTEXT, 0, strText.ToCharArray());
[/Quote]

请问下strText定义 和 在哪里获取值,谢谢
回复
wuyq11 2010-05-24
API操作
SendTxtMessage(hwdText, WM_SETTEXT, 0, strText.ToCharArray());
回复
healer_kx 2010-05-24
你应该用剪切板族的API了。
回复
加载更多回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2010-05-24 09:33
社区公告

让您成为最强悍的C#开发者