BOOL CConghuiDlg::PreTranslateMessage(MSG* pMsg) 
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN) 
{ switch (pMsg->wParam) 

case VK_F2: 
LPPOINT lpPoint;
::GetCursorPos(lpPoint);
int xPos,yPos;
xPos = lpPoint->x ;
yPos = lpPoint->y ;
// HWND   hwnd   =   ::GetTopWindow(NULL);
// ::SendMessage(hwnd,WM_LBUTTONDOWN,0,MAKELONG(xPos,yPos));
// ::SendMessage (hwnd,WM_LBUTTONUP,0,MAKELONG(xPos,yPos));
    ::SetCursorPos(xPos,yPos);   
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);   
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
}编译没有问题运行时报内存错误,不能为读,为什么啊?
以上两种发送消息的函数结果都一样。

解决方案 »

  1.   

    mouse_event 已经被sendinput 替代了
      

  2.   

    return 1;加上就可以了
    if (pMsg->message == WM_KEYDOWN)
    { switch (pMsg->wParam)
    {
    case VK_F2:
    {
    CPoint pt;
    GetCursorPos(&pt);
    int xPos,yPos;
    xPos = pt.x ;
    yPos = pt.y ; ::SetCursorPos(xPos,yPos);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
    return TRUE;
    }
    }
    return CDialog::PreTranslateMessage(pMsg);
      

  3.   

    我还是习惯用mouse_event,
    lz,你的函数没有返回值,参看二楼VisualEleven,另外如果只有一种case,就别用switch 了,switch 语句里定义变量容易出错,你的switch 好像也没有default情况
      

  4.   

    已经好了,多谢VisualEleven兄。
    问题应该出在返回值上。
    但是我的函数有返回值的就是最后的这句return Dialog::PreTranslateMessage(pMsg); 返回CDialog基类的函数返回值。由于太长了,我上次没有黏贴。
    看来是switch结构需要返回值了,以前用时没有返回值也都正常。莫非C++升级了?
      

  5.   

    很明显这里内存访问违规
    LPPOINT lpPoint;//没分配内存
    ::GetCursorPos(lpPoint);
    可改成
    POINT pt;//没分配内存
    ::GetCursorPos(&pt);
      

  6.   

    int i;
    .
    .
    .
    BOOL CMonimosueDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if (pMsg->message == WM_KEYDOWN)
    {switch (pMsg->wParam) 

    case VK_F2:
    {
    CPoint pt;
    GetCursorPos(&pt);
    int xPos,yPos;
    xPos = pt.x  ;
    yPos = pt.y  ;
    // HWND hwnd = ::GetTopWindow(NULL);
    // ::SendMessage(hwnd,WM_LBUTTONDOWN,0,MAKELONG(xPos,yPos));
    // ::SendMessage (hwnd,WM_LBUTTONUP,0,MAKELONG(xPos,yPos));
    ::SetCursorPos(xPos,yPos); 
    if(i==1)
    {         
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); 
    ::Sleep (1000);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    }
    }case VK_F3:
    {
    i=1;
    break;
    }
    return true;

    //return TRUE;}
    return CDialog::PreTranslateMessage(pMsg);
    }
    我设置了全局变量i,我想当我按下F3后再按F2才模拟鼠标单击,可是运行时发现,只要多按几次F2键就模拟鼠标单击了,根本不用先按F3键,为什么呢?当我按下F3再按F2有时会新启动一个当前的进程这又是什么原因啊?
      

  7.   

    我在case VK_F2:
    里多加了个break;
    现在好了,什么道理?
      

  8.   

    正常的写法是每一个case中都要加个break,除非你想接着执行后面的语句.
      

  9.   

     case 不加break要注释:否则会继续执行下个case。
    case x:
    //fall through
    //break;
      

  10.   

    你的VK_F2、VK_F3的代码在逻辑上是分离的,当然要用break分开。case VK_F3:像是个标签,可不是结束符,没有break,会一直执行下去的。
      

  11.   

    lz大哥,多看下基础吧,那个case如果不加 break,就按你的代码看,case VK_F2,开始运行后
    代码会一下往下面运行的,case VK_F3也会执行的,下面有多少代码,都全执行,不管有多少 case,如果没有break,就按代码一直往下执行....\汗一个
      

  12.   


    游戏有驱动保护的
    相关的API会被HOOK掉按键精灵的模拟鼠标键盘用的是驱动实现
      

  13.   

    不加break;是会继续执行下去,但是也要看 case 后的匹配吧,case VK_F3:不匹配我的按键,难道也会执行下面的i=1 ? 如果不匹配就应该跳过啊,直到最后都没有匹配的就结束了。
    我认为加入break的目的主要是提高效率的,不影响程序运行结果。
      

  14.   

    服了你了,自己去测试再回答case 'A':
    case 'B':
    case 'C':
     ... do something....break;
    case 'D':
    ....
    自己这样去试 如果 你的switch那里,进来的是 A B C  都执行一样的动作,因为有break,所以 case 'D'
    只有在进来的是 'D' 才执行