link:http://expert.csdn.net/Expert/topic/1376/1376808.xml?temp=.9594843

elvahuang 2003-01-20 05:50:32
http://expert.csdn.net/Expert/topic/1376/1376808.xml?temp=.9594843
...全文
77 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
elvahuang 2003-01-21
  • 打赏
  • 举报
回复





我的论坛 我的软件 我的订单 我的文档 我的简历


首 页 | 新 闻 | 技 术 | 论 坛 | 人 才 | 商 城 | 大本营 |《程序员》| 软 件

2002.12.19
English





-我的论坛-

我的问题
我参与的问题
我得分的问题
我的信誉分
我的收藏夹
短信息
使用帮助
我要投诉

CSDN - 专家门诊 - VC/MFC 基础类问题
回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 保存 | 关闭窗口


主  题: 钩子问题:为什么我不能阻止消息传递?高手帮忙看一下吧。分数随便给。
作  者: c2j (CFriend myFriend)
等  级:
信 誉 值: 100
所属论坛: VC/MFC 基础类
问题点数: 100
回复次数: 15
发表时间: 2002-12-14 15:09:32



我做了个鼠标钩子,我想在鼠标按下并移动时能够阻止消息传递。但是不知道为什么就是不行。我的程序是在鼠标按下并移动时在屏幕上绘图,要是不阻止消息传递,绘图的同时windows还会拉框。
LRESULT WINAPI LowLevelMouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
if (nCode>=0)
{
if (wparam==WM_LBUTTONDOWN)
glbMouseDown=true;
if (wparam==WM_LBUTTONUP)
glbMouseDown=false;
if(glbMouseDown && wparam==WM_MOUSEMOVE)//按下左键并移动
{
if (glhRecieveWnd)
{
::SendMessage(glhRecieveWnd,LINEUSE_MOUSEDOWN,wparam,lparam);
return 0;
}
}
return CallNextHookEx(glhHookMouse,nCode,wparam,lparam); //照例上面return 0了就不会有这个return了,但是绘图的同时仍然发送了消息,造成绘图的同时还拉框,我该怎么办?
}
}

因为WM_MOUSEMOVE和WM_LBUTTONDOWN不是同时传递的,可能问题处在这个上面,但不知道该如何解决。帮帮忙啊,解决问题分数随便给。



回复人: Saimen(单身情人) ( ) 信誉:100 2002-12-14 15:13:00 得分:0


我好象也是拦不下来,帮你UP到解决!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Top

回复人: dancing999(芯片) ( ) 信誉:100 2002-12-14 15:15:00 得分:0


帮你UP!


Top

回复人: fancycsj(狮子) ( ) 信誉:100 2002-12-14 15:29:00 得分:0


你可以试试这样改一下:
if(glbMouseDown && (wparam==WM_MOUSEMOVE))//按下左键并移动
好像是 && 比 == 的优先级高



Top

回复人: Saimen(单身情人) ( ) 信誉:100 2002-12-14 15:31:00 得分:0


对了,鼠标消息是这样的


按下时发送一个按下的消息

鼠标移动消息
移动时消息中有一个参数来表明是不是鼠标按下

鼠标放开消息


所以你这样写是不好的,当然也应可以用

if (wparam==WM_LBUTTONDOWN)
glbMouseDown=true;
if (wparam==WM_LBUTTONUP)
glbMouseDown=false;
if(glbMouseDown && wparam==WM_MOUSEMOVE)//按下左键并移动

________________________________________________________________

WM_MOUSEMOVE
fwKeys = wParam; // key flags
xPos = LOWORD(lParam); // horizontal position of cursor
yPos = HIWORD(lParam); // vertical position of cursor

fwKeys
Value of wParam. Indicates whether various virtual keys are down. This parameter can be any combination of the following values: Value Description
MK_CONTROL Set if the ctrl key is down.
MK_LBUTTON Set if the left mouse button is down.
MK_MBUTTON Set if the middle mouse button is down.
MK_RBUTTON Set if the right mouse button is down.
MK_SHIFT Set if the shift key is down.



当然上面的是 onmouseclick 的,和这个不一样,参考




Top

回复人: Saimen(单身情人) ( ) 信誉:100 2002-12-14 15:38:00 得分:0


不对不对,上面的是 onmessage 时的参数


Top

回复人: himachao(超超) ( ) 信誉:100 2002-12-14 15:41:00 得分:0


“up” 是什么意思呀?



Top

回复人: c2j(CFriend myFriend) ( ) 信誉:100 2002-12-14 21:37:00 得分:0


我现在碰到的问题是在(glbMouseDown && wparam==WM_MOUSEMOVE)真时(应该是),应该return 0,结果还是有return CallNextHookEx被传递出去。可能是分两次传递出去了。但是我不清楚这个消息传递流程。
现在情况就是在鼠标按下并移动时,sendmessage传递消息出去了,我主程序在屏幕上绘图,但结果return CallNextHookEx也被执行,在屏幕绘图的时候windows还在拉框。我该怎么办?


Top

回复人: c2j(CFriend myFriend) ( ) 信誉:100 2002-12-16 00:26:00 得分:0


救命啊,急用啊!


Top

回复人: rivershan(笨猫)(C++/MFC/COM初学者) ( ) 信誉:98 2002-12-16 09:14:00 得分:0


return CallNextHookEx(glhHookMouse,nCode,wparam,lparam);
是必须的~否则无法监视下一次的鼠标动作~
if (nCode>=0)
{
}
放在它的外面呢?


Top

回复人: c2j(CFriend myFriend) ( ) 信誉:100 2002-12-18 22:38:00 得分:0


我用今天仔细看了一下,发觉了一个非常奇怪的问题。
LRESULT WINAPI LowLevelMouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
if (nCode>=0)
{
if (wparam==WM_LBUTTONDOWN)
glbMouseDown=true;
if (wparam==WM_LBUTTONUP)
glbMouseDown=false;
if(glbMouseDown && wparam==WM_MOUSEMOVE)//按下左键并移动
{
if (glhRecieveWnd)
{
::SendMessage(glhRecieveWnd,LINEUSE_MOUSEDOWN,wparam,lparam);
return 0;
}
}
return CallNextHookEx(glhHookMouse,nCode,wparam,lparam); //我在debug时一设了breakpoint,然后运行时发现,当鼠标左键按下并且移动时,这条命令是不执行的,也就是说不会继续传递鼠标消息,但是实际情况就是鼠标在我的程序绘图的时候,还是在windows里拉框。如果我去掉这一行呢,倒是windows不响应鼠标消息了,但我还需要windows响应鼠标静止时左键单击。我看不懂啦!高手救命啊!
}
}



Top

回复人: demetry() ( ) 信誉:100 2002-12-18 23:15:00 得分:0


用return 1取代return 0试一试,可能会有帮助。没有return CallNextHookEx,系统仍然可以捕获鼠标动作;有了这个语句,主要作用是在拦截鼠标消息时,一旦超时,可以保证下一个钩子对消息进行拦截。


Top

回复人: hurry2002(阿闪) ( ) 信誉:100 2002-12-19 08:14:00 得分:0


對了!是return 1
不是return 0


Top

回复人: c2j(CFriend myFriend) ( ) 信誉:100 2002-12-19 13:24:00 得分:0


return 0 和return 1分别表示什么?
我用return 1后,鼠标按下就不能移动了?



Top

回复人: pzh508(小猪) ( ) 信誉:100 2002-12-19 14:03:00 得分:0


return 1好像是表示没有处理该消息
return 0好像是表示处理该消息。

你说“造成绘图的同时还拉框?”
还拉框是什么意思???
在你程序里你是要拦截两个消息吗??




Top

回复人: c2j(CFriend myFriend) ( ) 信誉:100 2002-12-19 16:39:00 得分:0


我发觉我在屏幕上绘图的同时windows还在桌面上拉了一个选择框。



Top







管理 | 关闭窗口






--------------------------------------------------------------------------------

网站简介 - 广告服务 - 网站地图 - 帮助信息 - 联系方式
百联美达美公司 版权所有 京ICP证020026号
Copyright © CSDN.net, Inc. All rights reserved

elvahuang 2003-01-21
  • 打赏
  • 举报
回复





我的论坛 我的软件 我的订单 我的文档 我的简历


首 页 | 新 闻 | 技 术 | 论 坛 | 人 才 | 商 城 | 大本营 |《程序员》| 软 件

2002.12.19
English





-我的论坛-

我的问题
我参与的问题
我得分的问题
我的信誉分
我的收藏夹
短信息
使用帮助
我要投诉

CSDN - 专家门诊 - VC/MFC 基础类问题
回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 保存 | 关闭窗口


主  题: 用CString::Left()时,有时最后的汉字是一半,怎么办?
作  者: micr0soft (威远)
等  级:
信 誉 值: 100
所属论坛: VC/MFC 基础类
问题点数: 200
回复次数: 34
发表时间: 2002-12-19 14:43:09



用CString::Left()时,有时最后的汉字是一半,怎么办?



回复人: Pipi0714(皮皮0714) ( ) 信誉:100 2002-12-19 14:52:00 得分:0


对于CString 来说一个汉字对应的字符的个数为2个所以你取的时候一定要注意:
比如:
CString str="中国";
你要取中字必须str.Left(2);当取一般的时候你只要把你的left的参数加1就可以了


Top

回复人: micr0soft(威远) ( ) 信誉:100 2002-12-19 14:56:00 得分:0


这个方法不行的,因为我不到字符串里到底是怎么,假如CString str="A中国";,那我取str.Left(2)不是中又成一半吗?



Top

回复人: ytweiwei(爱江山不爱美人) ( ) 信誉:100 2002-12-19 15:08:00 得分:0


gz


Top

回复人: sinqi() ( ) 信誉:100 2002-12-19 15:12:00 得分:0


检测每一字节是汉字的一部分还是其它字符就可以了.


Top

回复人: foxmail(萧遥) ( ) 信誉:110 2002-12-19 15:20:00 得分:0


看那个字符的ascii码,如果大于128就是汉字一部分,小于就不是汉字,这样就能区分了吧


Top

回复人: sinqi() ( ) 信誉:100 2002-12-19 15:24:00 得分:0


楼上说的是.


Top

回复人: rtdb(东临碣石) ( ) 信誉:100 2002-12-19 15:28:00 得分:0


也不行.
不知是汉字的前一半还是后一半.


Top

回复人: micr0soft(威远) ( ) 信誉:100 2002-12-19 15:29:00 得分:0


foxmail(萧遥)的方法是不行的,这样只能得到读取得字符是汉字还是Ascii码,不能判断是否是汉字的一半。


Top

回复人: shesh(无所谓) ( ) 信誉:100 2002-12-19 15:45:00 得分:0


先全部转化为unicode的.

_T("")

然后再按2倍数找.


Top

回复人: wang790729(tommy) ( ) 信誉:100 2002-12-19 15:52:00 得分:0


CString::GetLength()


Top

回复人: zhenxizhou(追忆) ( ) 信誉:100 2002-12-19 16:02:00 得分:0


gz


Top

回复人: cbc(逍遥子) ( ) 信誉:100 2002-12-19 16:17:00 得分:0



在一个英文字母和汉字混合的字符串中区分汉字和英文字符只能从字符串头开始判断,大致可以如下:
BYTE *p = string;
while(*p = 0){
if (*p == '\r' || *p == '\n'){
//回车符,换行符
}
if (*p > 0x80){
p+=2;//汉字
}
else{
p++;//英文字符
}
}



Top

回复人: Hawk_lp(流浪者) ( ) 信誉:100 2002-12-19 16:36:00 得分:0


英文属于单子节编码, 汉字属于多字节编码,国际标准多字结为UNICODE编码,标准之中定义了世界上大部分国家的代码页,一般代码为双字节,第一字节为前导字节表明语种,第二字节为代码页中对应的字符.
我国用的是自己定义的GB码,有些是双字节,有些是多字节,于UNICODE很不一样,
其实光凭HEX值,是可以显示任何代码页中的字符的,关键是要和代码页对应上,两个Hex值就可以显示一个汉字.
英文中每一个字符值(大小写)必小于128, 如果你的CString只有两种情况(全英文或全汉字)判断起来比较容易,汉字编码的第一个字节的最高位为1(>128无论是几个字节编码),若是英汉混合的情况,要检出其中一种,稍微麻烦一点,若要处理多国语言,好像有多国语言API函数,可以通过统计的方法检出一直对应的代码页.



Top

回复人: punks(墙皮皮) ( ) 信誉:100 2002-12-19 16:42:00 得分:0


http://expert.csdn.net/Expert/topic/1251/1251404.xml?temp=.7669794
判断所有的值,标准看上面那个帖子。


Top

回复人: fenex(爱看DVD) ( ) 信誉:100 2002-12-19 16:43:00 得分:0


其实转化为unicode再取也不失为一条捷径


Top

回复人: micr0soft(威远) ( ) 信誉:100 2002-12-19 17:05:00 得分:0


如何转换成Unicode码?
CString strText = _T( strChar );//注意:不能 _T("dsd");
这样不行的。!!


Top

回复人: papaya_stone(^_^)shentong(^_^) ( ) 信誉:100 2002-12-19 17:17:00 得分:0


if( (BYTE)str.Left(2) < 0xa1 )
{
//半角
.......
}
else
{
//全角
.......
}


Top

回复人: dsclub(▁▂▃▄▅▆▇█ 騩鹬) ( ) 信誉:100 2002-12-19 17:59:00 得分:0


还是VB好一些啦,Unicode的嘛


Top

回复人: cbc(逍遥子) ( ) 信誉:100 2002-12-19 18:45:00 得分:0


希望有所帮助

将ANSI转换到Unicode
(1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通过MultiByteToWideChar函数实现转换,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '\0';
(3)通过A2W宏来实现,例如:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);

将Unicode转换到ANSI
(1)使用WideCharToMultiByte,例如:
// 假设已经有了一个Unicode 串 wszSomeString...
char szANSIString [MAX_PATH];
WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
(2)使用W2A宏来实现,例如:
USES_CONVERSION;
pTemp=W2A(wszSomeString);



Top

回复人: Hanzo(不肯冷却的芯) ( ) 信誉:100 2002-12-19 18:50:00 得分:0


在程序的最开头:
#define _UNICODE
这样CString是按whar_t来装数据的.同时所有_T()回被解释成L. 这样就是双字节版本了.


Top

回复人: luixui(程序★美女★狗) ( ) 信誉:100 2002-12-19 19:01:00 得分:0


gz


Top

回复人: xuesong25() ( ) 信誉:100 2002-12-19 19:16:00 得分:0


好像在codeguru上有这个问题的答案,你自己去找


Top

回复人: differ1(我来自未来) ( ) 信誉:100 2002-12-19 19:39:00 得分:0


//记录当前行中汉字字节数,以防止将一半汉字分为两行

unsigned short halfChinese=0;

for(int i=0; i<=szString.GetLength()-1; i++)
{
if(((unsigned char)szString.GetAt(i) == 0x0d) &&
((unsigned char)szString.GetAt(i+1) == 0x0a))
theLineLength=0;

//大于0xa1的字节为汉字字节
if((unsigned char)szString.GetAt(i) >= 0xA1)
halfChinese++;
theLineLength++;

//如果行宽大于每行最大宽度,进行特殊处理
if(theLineLength > nMaxLineChar)
{
//防止将一个汉字分为两行,回溯
if(halfChinese%2)
{
szString.Insert(i,(unsigned char)0x0a);
szString.Insert(i,(unsigned char)0x0d);
}
else
{
szString.Insert(i-1,(unsigned char)0x0a);
szString.Insert(i-1,(unsigned char)0x0d);

}
theLineLength = 0;
}

}


Top

回复人: ManHard(极限男孩) ( ) 信誉:100 2002-12-19 19:40:00 得分:0


CString str="中国K美国";
LPCTSTR lpsz=str;
CString sLeft;
const int nLeft=4;
int nIndex=nLeft;
LPSTR lp=(LPSTR)lpsz;
int nSize=lstrlen(str);
while(nIndex--!=0)
{
lp=::CharNext(lp);
}
lstrcpyn(sLeft.GetBuffer(lp-lpsz+1) ,lpsz,lp-lpsz+1);
sLeft.ReleaseBuffer();
//sLeft="中国K美"


Top

回复人: RomanticProgrammer(兰企鹅||南极俺最帅) ( ) 信誉:100 2002-12-19 19:50:00 得分:0


学习...这个问题好.


Top

回复人: psusong(人类失去指针,世界将会怎样?) ( ) 信誉:110 2002-12-19 20:46:00 得分:0



设当前的位置为
pos,对应的字符为ch
if(ch>128)//是汉字的一部分
chNext=(pos+1)位置的字符;
if(chNext>128)
说明pos是汉字的后一个字节,调整pos为pos+1;
否则,位置就是pos
-----------------------------
以上可以用CString 得成员函数find()很容易实现!


Top

回复人: micr0soft(威远) ( ) 信誉:100 2002-12-19 22:01:00 得分:0


汉字编码的第一个

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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