如何获取鼠标双键按下和释放消息???

lincaicong 2003-10-21 01:47:23
我想对鼠标左右双键同时按下和释放消息进行处理,可是classwizard里没有这两个消息啊。我如何才能实现啊??解决了立即给分
...全文
227 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
leopardsmith 2003-11-10
  • 打赏
  • 举报
回复
对,同时按下不是绝对的,有个时间差问题
lincaicong 2003-11-10
  • 打赏
  • 举报
回复
thisisjjj(jeffry)说的对,我要的就是这种效果。就象win扫雷程序一样的双键事件。
最近很忙,所以到今天才来结贴。感谢大家
zhaowenlong 2003-10-22
  • 打赏
  • 举报
回复
别着急,我给你做了一个程序,我是用动态链接库做的,你看看吧.
我给你主要的部分吧.
MouseLeftandRightDown.h 文件内容

#define DllExport __declspec(dllexport)
DllExport void WINAPI InstallLaunchEv(BOOL bFlag);
DllExport void WINAPI UnInstallLaunchEv();
//DllExport void WINAPI InstallLaunchEv();
//void SaveLog(char* c);
//void Tanchu(int i);
class CMouseLeftandRightDownApp : public CWinApp
{
public:
CMouseLeftandRightDownApp();

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CLaunchDLLApp)
//}}AFX_VIRTUAL

//{{AFX_MSG(CLaunchDLLApp)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:

};
MouseLeftandRightDown.cpp 文件内容
CMouseLeftandRightDownApp theApp;
HHOOK Hook,Hook1;
BOOL Condition1=0;
BOOL Condition2=0;
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
void SaveLog(char* c);
DllExport void WINAPI UnInstallLaunchEv()
{

UnhookWindowsHookEx(Hook1);
}
DllExport void WINAPI InstallLaunchEv(BOOL bFlag) //建立钩子,并传入记录指针p
{
Hook1=(HHOOK)SetWindowsHookEx(WH_MOUSE,
(HOOKPROC)MouseProc,
theApp.m_hInstance,
0);
CString name;
name.Format("c:\\window.log");
CFile file;
if(!file.Open(name,CFile::modeCreate|CFile::modeWrite))
{
file.Open(name,CFile::modeCreate|CFile::modeReadWrite);
}

file.Close();
}
void SaveLog(char* c)
{
CTime tm=CTime::GetCurrentTime();
CString name;
name.Format("c:\\window.log");
CFile file;
if(!file.Open(name,CFile::modeReadWrite))
{
file.Open(name,CFile::modeCreate|CFile::modeReadWrite);
}
file.SeekToEnd();
file.Write(c,1);
file.Close();
}
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LRESULT Result=CallNextHookEx(Hook1,nCode,wParam,lParam);
if(nCode>=0)
{
if(wParam==WM_LBUTTONDOWN) //左键按下
Condition1=1;
if(wParam==WM_LBUTTONUP)//左键抬起

Condition1=0;
if(wParam==WM_RBUTTONDOWN)//右键按下

Condition2=1;
if(wParam==WM_RBUTTONUP)//右键抬起
Condition2=0;

if(Condition1 & Condition2) //如果同时按下,则在文件中写入一个'+'字符
{
SaveLog("+");
}
}
return Result;
}
我的信箱是:zhaowl@163.com
如果你要源码,我发给你.
mfc168 2003-10-22
  • 打赏
  • 举报
回复
系统所忽略的是单独的DOWN、SEL等,因为这个是系统所要处理的消息,如果单纯的鼠标左键消息,就只能用MOUSEHOOK了,而你所要的是两个键的组合,这样就可以进行组合
whatthehell 2003-10-22
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2381/2381107.xml?temp=.296261
thisisjjjj 2003-10-22
  • 打赏
  • 举报
回复
If you call SystemParametersInfo with the SPI_SETMOUSEKEYS value, the following flags are ignored:

MKF_LEFTBUTTONDOWN
MKF_LEFTBUTTONSEL
MKF_MOUSEMODE
MKF_RIGHTBUTTONDOWN
MKF_RIGHTBUTTONSEL


还怎么组合?
mfc168 2003-10-22
  • 打赏
  • 举报
回复
这样来做:
使用函数:SystemParametersInfo
参数选择SPI_SETMOUSEKEYS,
typedef struct _MOUSEKEYS {
DWORD cbSize;
DWORD dwFlags;
DWORD iMaxSpeed;
DWORD iTimeToMaxSpeed;
DWORD iCtrlSpeed;
DWORD dwReserved1;
DWORD dwReserved2;
} MOUSEKEYS, *LPMOUSEKEYS;

其中dwFlags可以进行左右键的组合
thisisjjjj 2003-10-22
  • 打赏
  • 举报
回复
其实WINDOWS下的扫雷就用到了双键同按。不过看来它也没有考虑过双键按下的时间差。
由此可以断定,微软并没有将双键同按作为基本功能来实现。
lincaicong 2003-10-22
  • 打赏
  • 举报
回复
就两个人,一人25分太浪费了,大家再提点意见,我就结了
lincaicong 2003-10-22
  • 打赏
  • 举报
回复
看来只能这么做了。唉,结帐结帐。
jfzsl 2003-10-22
  • 打赏
  • 举报
回复
mark
thisisjjjj 2003-10-22
  • 打赏
  • 举报
回复
楼主的意思,我觉得应该是希望能够体现双键同按时候微小的时间差。
时间差大了,就认为是两个独立的事件;时间差较小,就认为是一次双键同按事件...
Sword_Sharp 2003-10-22
  • 打赏
  • 举报
回复
或者这样
在 OnLButtonDown 函数中添加如下代码:
if(nFlags == (MK_LBUTTON | MK_RBUTTON))
{
AfxMessageBox("OK");//用你的代码代替
}

在 OnRButtonDown 函数中添加如下代码:
OnLButtonDown(nFlags, point)

就可以了
Sword_Sharp 2003-10-22
  • 打赏
  • 举报
回复
其实没有必要这么麻烦;
那对话框举一个例子:
1。在对话框中添加两个消息处理函数:OnRButtonDown OnLButtonDown 分别处理 WM_LBUTTONDOWN 和 WM_RBUTTONDOWN
2。然后在两个函数的函数体中添加相同的代码(如下)
if(nFlags == (MK_LBUTTON | MK_RBUTTON))
{
AfxMessageBox("OK"); //用自己的代码替代这里的语句;
}
3。测试OK
thisisjjjj 2003-10-21
  • 打赏
  • 举报
回复
其实想想,就算用钩子来做,多半也得自己来处理这个微小的时间差吧?
thisisjjjj 2003-10-21
  • 打赏
  • 举报
回复
所谓“同时”,也仅仅是时间差比较小而已。
设个记时器?
lincaicong 2003-10-21
  • 打赏
  • 举报
回复
其实我也用过这个方法,可是对于要检查同时按下,又同时释放却很麻烦。
thisisjjjj 2003-10-21
  • 打赏
  • 举报
回复
有个笨办法,但是可行,我也在SDK下用过:
响应鼠标左键按下的消息,在其中判断鼠标右键的状态。
响应鼠标右键按下的消息,在其中判断鼠标左键的状态。

呵呵,是很笨,不过能用。

钩子我还没学,不太懂。

仅供参考。
lincaicong 2003-10-21
  • 打赏
  • 举报
回复
如何设置钩子啊,不会??能不能详细点
windows_editor 2003-10-21
  • 打赏
  • 举报
回复
设置鼠标钩子

16,471

社区成员

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

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

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