ctrl+v后字符是"怎样"输出

没原来那个名字长了 2009-08-19 04:49:15
比如我复制一个字符串"abc"
然后我把它粘贴到记事本->用sp++查只得到wm_command消息....
然后我把他粘贴到魔兽争霸里面云sp++查只有WM_KEYDOWN消息....
虽然消息不一样可结果是一样的....在可以输入的地方显示了"abc"
我知道魔兽里用的是utf-8的所以如果是中文可能出错这里不是讨论怎样让他不乱码.....
我只想知道ctrl+v背后的事情.....
ctrl+v之后调用了是什么才让字符输出到编辑框中去的
有理有分......
...全文
125 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
MoXiaoRab 2009-08-19
用key_event看看
回复
zhugay 2009-08-19
按ctrl+v,记事本在快捷键表里发现是个快捷键,转换成了相应的菜单命令。
ctrl+v的组合键,可以由OnChar捕获到,nChar = 22
回复
见习学术士 2009-08-19
LZ 在做魔兽的什么辅助工具,我对此很感兴趣哇

回复
看来大家对低层的东西不太关心啊.....算了只能用剪贴板然后再通过模拟键盘发送按键ctrl+v来实现文字输出了
提示这个问题的原因是因为我找不到魔兽争霸聊天栏的控件ID....这直接导致我没法用SetWindowText...然后我试着发送wmchar消息结果也不成功(wmchar在其它一般的程序试过是可以的,可能是因为war3用的是utf-8的原因吧)...我现在的做法是先把CString转成utf-8然后发送到剪贴板然后再模拟键盘发送按键ctrl+v来实现文字输出.....
不知各位大大还有没有更好的建议..........没有的话明天给分了.......
回复
副组长 2009-08-19
[Quote=引用 9 楼 free365 的回复:]
以上代码是可以写入数据到剪贴板但我还是想知道ctrl+v之后显示器是怎样显示字符的......
[/Quote]

裁剪版不仅保存了你拷贝的文字信息,同时还包括有关这些数据的元数据,ctrl+v以后应用程序分析元数据格式,再按格式显示,不但可以显示文字,还可以显示位图等。如果你从网页上拷贝一段文字到WORD里面,字体字号字符颜色等信息都一同拷贝了。但是如果你粘贴到记事本里面,记事本不能处理这些字符属性,就只有文字,字体字号等属性就丢弃了。WORD里面的选择粘贴->无格式文本也是这样的情况。
具体参考元数据格式。
回复
[Quote=引用 7 楼 oyljerry 的回复:]
引用 6 楼 free365 的回复:
引用 4 楼 mazm_yanzhu 的回复:
复制只是将选中的内容放入到剪贴板,那相当于一个内存buffer,在粘贴时将该内存的东西拷贝到目标地址

这么说我直接写内存也可以达到跟ctrl+v同样的效果了

你只要写入正确的clipboard 对应的数据内存等...
[/Quote]

if(OpenClipboard())
{
CString str;
HANDLE hClip;
char *pBuf;
EmptyClipboard();
GetDlgItemText(IDC_EDIT_SEND,str);
hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);
pBuf=(char*)GlobalLock(hClip);
strcpy(pBuf,str);
GlobalUnlock(hClip);
SetClipboardData(CF_TEXT,hClip);
CloseClipboard();
}

以上代码是可以写入数据到剪贴板但我还是想知道ctrl+v之后显示器是怎样显示字符的......
回复
[Quote=引用 1 楼 neohope 的回复:]
你的到的消息是不对的
至少在笔记本里有wm_copy及获取文本长度等信息
自己好好看看
[/Quote]
现在的重点不是消息对不对的问题......
我想知道他是怎样实现字符显示的........
比如象SetWindowText那样.....后面的显示过程是我关心的重点.....
回复
oyljerry 2009-08-19
[Quote=引用 6 楼 free365 的回复:]
引用 4 楼 mazm_yanzhu 的回复:
复制只是将选中的内容放入到剪贴板,那相当于一个内存buffer,在粘贴时将该内存的东西拷贝到目标地址

这么说我直接写内存也可以达到跟ctrl+v同样的效果了
[/Quote]
你只要写入正确的clipboard 对应的数据内存等...
回复
[Quote=引用 4 楼 mazm_yanzhu 的回复:]
复制只是将选中的内容放入到剪贴板,那相当于一个内存buffer,在粘贴时将该内存的东西拷贝到目标地址
[/Quote]
这么说我直接写内存也可以达到跟ctrl+v同样的效果了
回复
BAKER_LEE 2009-08-19
估计是你看漏了WM_PASTE消息
An application sends a WM_PASTE message to an edit control or combo box to copy the current content of the clipboard to the edit control at the current caret position. Data is inserted only if the clipboard contains data in CF_TEXT format.


回复
mazm_yanzhu 2009-08-19
复制只是将选中的内容放入到剪贴板,那相当于一个内存buffer,在粘贴时将该内存的东西拷贝到目标地址
回复
oktsl 2009-08-19
复制时 wm_copy 拷到内存里
粘贴 wm_paste从内存拷出来
回复
wish_cn 2009-08-19
你应该用spyxx查看记事本的edit控件的消息,而不是记事本大窗口的消息。
回复
neohope 2009-08-19
你的到的消息是不对的
至少在笔记本里有wm_copy及获取文本长度等信息
自己好好看看
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告