C++ 为什么我能';t在回调函数中使用此代码?

C++ 为什么我能';t在回调函数中使用此代码?,c++,mfc,C++,Mfc,我希望更改静态文本,但我不能 LRESULT CALLBACK KeybdProc(int nCode, WPARAM wParam, LPARAM lParam) { if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN)) { KBDLLHOOKSTRUCT *pKey = (KBDLLHOOKSTRUCT*)lParam; int key = pKey->vkCode;

我希望更改静态文本,但我不能

LRESULT CALLBACK KeybdProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
    {
        KBDLLHOOKSTRUCT *pKey = (KBDLLHOOKSTRUCT*)lParam;
        int key = pKey->vkCode;
        cout << key << " ";
        if (key == VK_INSERT)
        {
        SetDlgItemText(IDC_STATUSTEXT, "On")
        }
        if (key == VK_DELETE)
        {
            SetDlgItemText(IDC_STATUSTEXT, "Off")
        }
    }
CallNextHookEx(KbHook, nCode, wParam, lParam);
return 0;

}

HHOOK KbHook;

BOOL CUSBDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

SetDlgItemText(IDC_STATUSTEXT, "Successfully Loaded!!!");

cout << "Successfully Loaded !!!" << endl;
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);

HMODULE hInstance = GetModuleHandle(NULL);
KbHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeybdProc, hInstance, 0);

return TRUE;

}
在KeybdProc中

如果我试着像这样使用这个函数

LRESULT CALLBACK KeybdProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
    {
        KBDLLHOOKSTRUCT *pKey = (KBDLLHOOKSTRUCT*)lParam;
        int key = pKey->vkCode;
        cout << key << " ";
        if (key == VK_INSERT)
        {
            SetDlgItemText(IDC_STATUSTEXT, "On")
            Pray(0x04, 6)
        }
        if (key == VK_DELETE)
        {
            SetDlgItemText(IDC_STATUSTEXT, "Off")
        }
    }
CallNextHookEx(KbHook, nCode, wParam, lParam);
return 0;

}
LRESULT回调KeybdProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
if((nCode==HC\u ACTION)&&(wParam==WM\u KEYDOWN))
{
KBDLLHOOKSTRUCT*pKey=(KBDLLHOOKSTRUCT*)LPRAM;
int key=pKey->vkCode;

cout您的回调不是dialog类的非静态方法,因此它没有用于调用和
CUSBDlg::Prey()
方法的
this
指针。您在
Prey()
上得到了一个“未声明的标识符”错误,因为在作用域中没有具有该名称的函数。并且您得到了“函数不接受2个参数”错误,因为回调正在尝试调用Win32 API函数,该函数在作用域中,但接受3个参数作为输入

要解决这两个问题,您需要存储指向对话框的全局指针,以便回调可以在需要时访问它,例如:

CUSBDlg *Dlg;
HHOOK KbHook;

LRESULT CALLBACK KeybdProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
    {
        KBDLLHOOKSTRUCT *pKey = (KBDLLHOOKSTRUCT*)lParam;
        int key = pKey->vkCode;
        cout << key << " ";
        if (key == VK_INSERT)
        {
            Dlg->SetDlgItemText(IDC_STATUSTEXT, "On")
            Dlg->Pray(0x04, 6)
        }
        if (key == VK_DELETE)
        {
            Dlg->SetDlgItemText(IDC_STATUSTEXT, "Off")
        }
    }

    CallNextHookEx(KbHook, nCode, wParam, lParam);
    return 0;
}

BOOL CUSBDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    ...

    Dlg = this;

    GetModuleHandle(NULL);
    KbHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeybdProc, hInstance, 0);

    ...
}
CUSBDlg*Dlg;
HHOOK-KbHook;
LRESULT回调KeybdProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
if((nCode==HC\u ACTION)&&(wParam==WM\u KEYDOWN))
{
KBDLLHOOKSTRUCT*pKey=(KBDLLHOOKSTRUCT*)LPRAM;
int key=pKey->vkCode;
不能祈祷(0x04,6)
}
if(key==VK_DELETE)
{
Dlg->SetDlgItemText(IDC\U状态文本,“关闭”)
}
}
CallNextHookEx(KbHook、nCode、wParam、lParam);
返回0;
}
BOOL CUSBDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
Dlg=这个;
GetModuleHandle(NULL);
KbHook=SetWindowsHookEx(WH_KEYBOARD_LL,KeybdProc,hInstance,0);
...
}

没有理由使<代码> KBHOKECU/<代码> Global——第一个参数<代码> CallNextHookEx <代码>被忽略。但是,您的问题看起来好像不知道如何调用C++中的成员函数,它与Windows API无关,尽管第一个代码示例没有指明问题发生的地方。我们很难测试自己,因为这不是一个。请你帮助我:“?”代码> CUBDLG::PROYE()/<代码>?读一本书,或者两本,这些伪品会逐渐消失。更为严肃的一点是:不管你祈祷多少,除非你对C++和Windows API有着坚定的把握,否则你的MFC努力不会很好地结束。
CUSBDlg *Dlg;
HHOOK KbHook;

LRESULT CALLBACK KeybdProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
    {
        KBDLLHOOKSTRUCT *pKey = (KBDLLHOOKSTRUCT*)lParam;
        int key = pKey->vkCode;
        cout << key << " ";
        if (key == VK_INSERT)
        {
            Dlg->SetDlgItemText(IDC_STATUSTEXT, "On")
            Dlg->Pray(0x04, 6)
        }
        if (key == VK_DELETE)
        {
            Dlg->SetDlgItemText(IDC_STATUSTEXT, "Off")
        }
    }

    CallNextHookEx(KbHook, nCode, wParam, lParam);
    return 0;
}

BOOL CUSBDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    ...

    Dlg = this;

    GetModuleHandle(NULL);
    KbHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeybdProc, hInstance, 0);

    ...
}