Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何避免重复发送消息_C++_Winapi_Hook_Dry_Sendmessage - Fatal编程技术网

C++ 如何避免重复发送消息

C++ 如何避免重复发送消息,c++,winapi,hook,dry,sendmessage,C++,Winapi,Hook,Dry,Sendmessage,我有一个问题:我使用来自DLL中的程序的SendMessage与主窗口通信;过程是一个钩子过程,它允许主窗口知道何时在编辑框中单击鼠标右键;它还发送editbox的句柄。它工作得很好,除了这个bug:当程序在没有断点的情况下运行时,主窗口会收到两次相同的消息(在本例中为WM_应用程序),而如果我在钩子过程或处理WM_应用程序消息的块中放置一个断点,则该消息会被视为一次。关于更多的描述,请询问我。遵循钩子过程和处理WM_应用程序消息的块的代码。谢谢 挂钩程序 MYDLL_API LRESULT C

我有一个问题:我使用来自DLL中的程序的SendMessage与主窗口通信;过程是一个钩子过程,它允许主窗口知道何时在编辑框中单击鼠标右键;它还发送editbox的句柄。它工作得很好,除了这个bug:当程序在没有断点的情况下运行时,主窗口会收到两次相同的消息(在本例中为WM_应用程序),而如果我在钩子过程或处理WM_应用程序消息的块中放置一个断点,则该消息会被视为一次。关于更多的描述,请询问我。遵循钩子过程和处理WM_应用程序消息的块的代码。谢谢

挂钩程序

MYDLL_API LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// processes the message
if(nCode >= 0)
{
    // if user clicked with mouse right button
    if(wParam != NULL && (wParam == WM_RBUTTONDOWN || wParam == WM_RBUTTONUP))
    {
        wchar_t *s = (wchar_t*) malloc(CLASSNAMELEN*sizeof(wchar_t));
        //MessageBox(mainHwnd, (LPCWSTR)L"Captured mouse right button", (LPCWSTR)L"Test", MB_OK);
        MOUSEHOOKSTRUCT *m = (MOUSEHOOKSTRUCT*) lParam;
        GetClassName(m->hwnd, (LPWSTR) s, CLASSNAMELEN);
        //MessageBox(mainHwnd, (LPCWSTR) s, (LPCWSTR)L"Test", MB_OK);
        // only if user clicked on a edit box
        if(wcsncmp(s, L"Edit", 4) == 0)
            SendMessage(mainHwnd, WM_APP, 0, (LPARAM) lParam);
        free(s);
        s = NULL;
    }
}

// calls next hook in chain
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
处理WM_应用程序消息的主程序中的块

case WM_APP:
    {
        //MessageBox(hWnd, (LPCWSTR)L"Received WM_APP", (LPCWSTR)L"Test", MB_OK);
        // copies text from the edit box
        MOUSEHOOKSTRUCT *m = (MOUSEHOOKSTRUCT*) lParam;
        int n = GetWindowTextLength(m->hwnd);
        // if text has been inserted
        if(n > 0 && n < 1024)
        {
            wchar_t *s = (wchar_t*) malloc((n+1)*sizeof(wchar_t));
            // gets text
            GetWindowText(m->hwnd, (LPWSTR) s, n+1);
            s[n] = (wchar_t) 0;
            //MessageBox(hWnd, (LPCWSTR)s, (LPCWSTR)L"Test", MB_OK);
            // saves text in database
            stateClassPointer->insertInList(s); 
        }
    }
    break;
案例WM\u应用程序:
{
//消息框(hWnd,(LPCWSTR)L“已接收WM_应用程序”,(LPCWSTR)L“测试”,MB_OK);
//从编辑框复制文本
MOUSEHOOKSTRUCT*m=(MOUSEHOOKSTRUCT*)lParam;
int n=GetWindowTextLength(m->hwnd);
//如果已插入文本
如果(n>0&&n<1024)
{
wchar_t*s=(wchar_t*)malloc((n+1)*sizeof(wchar_t));
//获取文本
GetWindowText(m->hwnd,(LPWSTR)s,n+1);
s[n]=(wchar_t)0;
//消息框(hWnd,(LPCWSTR)s,(LPCWSTR)L“测试”,MB_OK);
//在数据库中保存文本
stateClassPointer->插入列表;
}
}
打破

这可能是因为您正在发送WM_RBUTTONDOWN和WM_RBUTTONUP的消息,即右键按下和释放时

当您调试WM_RBUTTONUP时,调试器会吃掉它,因此您无法得到它


PS:为了安全起见,是否应该使用PostMessage()而不是SendMessage()?

你说得对:)但是,我检查得更好,钩子过程由接收消息的窗口过程的同一线程处理。。在这种情况下,我还必须使用PostMessage,或者我可以使用SendMessage?似乎说我可以使用SendMessage。。或者我错了?当然可以,如果你使用的是同一个线程,那就没有问题了。但是我更喜欢将钩子的代码保持在最低限度,以避免干扰其他程序/线程的行为。PostMessage会立即返回,因此您可以在主循环中逗留,而不会感到良心不安。考虑到它也是一个具有足够开销的全局钩子,这是一个好主意。谢谢:)