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);但是发现内容根本没被复制下来。

求大侠们提供解决方法。
...全文
2515 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yqb_last 2012-03-04
  • 打赏
  • 举报
回复
剪切板上的太随意了啊 有用钩子实现的吗 求教啊
xkclub 2012-01-26
  • 打赏
  • 举报
回复
我也想知道你到底么样实现的,可以给看一下代码吗?
09软件_魏世琦 2011-09-23
  • 打赏
  • 举报
回复
请教您一下,您到底是怎么实现的呢~~
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了。
加载更多回复(1)

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧