gpt4 book ai didi

c++ - 如何避免重复发送消息

转载 作者:行者123 更新时间:2023-11-30 03:06:03 25 4
gpt4 key购买 nike

我有一个问题:我使用 DLL 中的一个过程中的 SendMessage 与主窗口进行通信; procedure 是一个钩子(Hook)程序,它允许主窗口知道何时在编辑框中单击鼠标右键;它还发送编辑框的句柄。它运行良好,除了这个错误:当程序在没有断点的情况下运行时,主窗口会收到两次相同的消息(在本例中为 WM_APP),而如果我在 Hook 过程或处理 WM_APP 消息的 block 中放置断点,则消息是考虑过一次。如需进一步说明,请问我。遵循 Hook 过程和处理 WM_APP 消息的 block 的代码。谢谢

钩子(Hook)程序

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_APP 消息的主程序中阻塞

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_RBUTTONDOWN 和 WM_RBUTTONUP 的消息,即按下右键和释放时。

当您调试 WM_RBUTTONUP 时,调试器会吃掉它,因此您无法获取它。

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

关于c++ - 如何避免重复发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7108725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com