做了个对话框程序,添加了WindowProc,响应WM_MOUSEMOVE的时候鼠标移到对话框上指针就跳开了,为什么?

zhuwenzheng 2002-08-01 10:18:00
LRESULT CBlueChatDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
GetCursorPos(&pt);
x=pt.x;
y=pt.y;
if( (input_data[1]&0x80)==0x80)
{
input_data[1]=(~input_data[1]+1)&0x7f;
y+=input_data[1];
}
else y-=input_data[1];
x+=input_data[0];
SetCursorPos(x,y);

break;
...
}

}


在另外一个方法中这样:
::SendMessageCallback(HWND_BROADCAST,WM_MOUSEMOVE,0,0,0,0);
功能就是使得指针移动,但不知道为什么,只要鼠标移到对话框上,指针就跳开了
...全文
296 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuwenzheng 2002-08-02
  • 打赏
  • 举报
回复
to jishiping:
WM_MOUSEMOVE是我自己通过SendMessageCallBack(..)发送的,在这里并不是WINDOWS本身的鼠标移动消息,然后通过响应WM_MOUSEMOVE使得鼠标移动

我用SendInput试过了,结果一样,代码如下 GetCursorPos(&pt);
x=pt.x;
y=pt.y;
if( (input_data[1]&0x80)==0x80)
{
input_data[1]=(~input_data[1]+1)&0x7f;
y+=input_data[1];
}
else y-=input_data[1];
x+=input_data[0];
Input.type=INPUT_MOUSE;
Input.mi.dwFlags=MOUSEEVENTF_MOVE;
Input.mi.dx=x;
Input.mi.dy=y;
SendInput(1,&Input,sizeof(Input));

zhuwenzheng 2002-08-02
  • 打赏
  • 举报
回复
我去试试
In355Hz 2002-08-02
  • 打赏
  • 举报
回复
我的意思是在OnDataReceived中间直接使用mouse_event和SendInput改变鼠标的位置,如:
void CBlueChatDlg::OnDataReceived (void *p_data, UINT16 len)
{
POINT pt;
GetCursorPos(&pt);

if( (p_data[1]&0x80)==0x80)
{
p_data[1]=(~input_data[1]+1)&0x7f;
y+=p_data[1];
}
else y-=input_data[1];
x+=input_data[0];
Input.type=INPUT_MOUSE;
Input.mi.dwFlags=MOUSEEVENTF_MOVE;
Input.mi.dx=x;
Input.mi.dy=y;
SendInput(1,&Input,sizeof(Input));
}
这样系统会改变鼠标位置并自动给有关的窗口发送WM_MOUSEMOVE消息,不用你
用BROADCAST向每一个窗口发送了。
你好象是在OnDataReceived 里面接受输入,然后向每个窗口发送WM_MOUSEMOVE消息模拟Window的鼠标消息发送,但是又要改变鼠标位置来反映鼠输入的情况,所以在你的Dialog中响应WM_MOUSEMOVE消息改变鼠标位置,其实这些通过mouse_event和SendInput可以一并实现。它们相当于模拟鼠标设备的动作。
ThisTimeThree 2002-08-02
  • 打赏
  • 举报
回复
你在WM_MOUSEMOVE里调用SendInput

WM_MOUSEMOVE->SendInput 或SetCursorPos->引发新WM_MOUSEMOVE->SendInput->鼠标到对话框外,所以没有WM_MOUSEMOVE->正常,前面都是这样说的啊。家一个开关吧,
添 加 类成员 BOOL jp = true;

OnMouseMove(...)
{
if(jmp == true)
{
jmp = false;
mouse_event or SetCursorPos or SendInput
}
else
{
jmp = true;
}
...



zhuwenzheng 2002-08-01
  • 打赏
  • 举报
回复
不对呀,鼠标不在对话框上的时候可以移动啊,是根据input_data[0],input_data[1]来的,但是只要到对话框上,就跳开
In355Hz 2002-08-01
  • 打赏
  • 举报
回复
有可能是坐标转换的问题,鼠标不在对话框上移动的时候对话框不能收到鼠标消息,当然不会SetCursorPos使鼠标跳开了。
zhuwenzheng 2002-08-01
  • 打赏
  • 举报
回复
试过了,不行,而且我的鼠标只有在对话框上移动的时候才出现以上情况,其他正常
heweixing_77 2002-08-01
  • 打赏
  • 举报
回复
你用GetCursorPos得到的是鼠标相对于屏幕左上角的坐标,要用ScreenToClient转换才变成相对于对话框左上角的坐标,试试看。
zhuwenzheng 2002-08-01
  • 打赏
  • 举报
回复
我的input_data[0],[1]实时变化的,xPos == yPos == 0;是不会的
wanglei888 2002-08-01
  • 打赏
  • 举报
回复
对WM_MOUSEMOVE而言,
xPos = LOWORD(lParam); //client area coordinate
yPos = HIWORD(lParam);

你传入的参数是0,所以xPos == yPos == 0;所以鼠标就跳开了
bcb_fans 2002-08-01
  • 打赏
  • 举报
回复
跟VC相关,我无能为力。就提供一个建议吧,鼠标跳开可能是由程序中的SetCursorPos语句引起的,把InputData贴出来看看,这样比较方便判断。
In355Hz 2002-08-01
  • 打赏
  • 举报
回复
如果你想全面的控制鼠标的输入,mouse_event和SendInput要好用得多。
jishiping 2002-08-01
  • 打赏
  • 举报
回复
不是怎么避免的问题。我也不知道你响应WM_MOUSEMOVE的代码做什么用的。
如果你不调用SetCursorPos的话,鼠标指针肯定不会乱跑啦。所以,你上面
的代码究竟是干什么用的,别人不知道,又怎么发言呢?所以我只能说,不
调用SetCursorPos的话,鼠标指针肯定不会乱跑。但是这样的话,好像又变
成什么事也不做了。
jlqidan 2002-08-01
  • 打赏
  • 举报
回复
gz
zhuwenzheng 2002-08-01
  • 打赏
  • 举报
回复
奇怪,我这样做鼠标不动
bcb_fans 2002-08-01
  • 打赏
  • 举报
回复
建议定义你自己的消息,然后收到数据时想窗口发送自定义的消息,

void CBlueChatDlg::OnDataReceived (void *p_data, UINT16 len)
{
char sz[100];
//CString msg( (LPCTSTR) p_data, len);


memcpy(input_data,p_data,len);
/////////Send mousemove message(X & Y )/////////

::SendMessage(hDialogWnd,WM_USER + 100,0,0);

//::SendMessageCallback(HWND_BROADCAST,WM_MOUSEMOVE,0,0,0,0);
}

LRESULT CBlueChatDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_USER + 100 :
GetCursorPos(&pt);
x=pt.x;
y=pt.y;
if( (input_data[1]&0x80)==0x80)
{
input_data[1]=(~input_data[1]+1)&0x7f;
y+=input_data[1];
}
else y-=input_data[1];
x+=input_data[0];
SetCursorPos(x,y);

break;
...
}

}


wanglei888 2002-08-01
  • 打赏
  • 举报
回复
你直接SendMessageCallback(HWND_BROADCAST,WM_MOUSEMOVE,0,MAKELPARAM(input_data[0],input_data[1]),0,0),然后不用再特别的处理对话框的消息。

这样不行吗?
zhuwenzheng 2002-08-01
  • 打赏
  • 举报
回复
TO JISHIPING
怎样避免
jishiping 2002-08-01
  • 打赏
  • 举报
回复
事情很简单啊,因为程序在响应消息WM_MOUSEMOVE时,调用了SetCursorPos,
鼠标指针当然跳开了。
In355Hz 2002-08-01
  • 打赏
  • 举报
回复
你发送WM_MOUSEMOVE消息到所有的Window窗口里模拟鼠标移动的效果?

这个代码不全吧。SendMessageCallback应该带上SendAsyncProc才对啊。

我猜在WM_MOUSEMOVE消息的处理中使用SetCursorPos会导致另外的WM_MOUSEMOVE消息产生,这样一个套一个,直到鼠标跑到窗口外,窗体收不到WM_MOUSEMOVE消息为止,所以鼠标移到对话框上,指针就跳开了。

为什么不用mouse_event
VOID mouse_event(
DWORD dwFlags, // motion and click options
DWORD dx, // horizontal position or change
DWORD dy, // vertical position or change
DWORD dwData, // wheel movement
ULONG_PTR dwExtraInfo // application-defined information
);
或者SendInput(WinNT/2000)?
UINT SendInput(
UINT nInputs, // count of input events
LPINPUT pInputs, // array of input events
int cbSize // size of structure
);
加载更多回复(8)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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