Как избежать повторного SendMessage

У меня проблема: я использую SendMessage из процедуры в DLL для связи с главным окном; процедура — это процедура-ловушка, которая позволяет главному окну узнать, когда нажата правая кнопка мыши в поле редактирования; он также отправляет дескриптор поля редактирования. Работает хорошо, за исключением этой ошибки: когда программа работает без точек останова, главное окно дважды получает одно и то же сообщение (в данном случае WM_APP), а если я ставлю точку останова в процедуре ловушки или в блоке, который обрабатывает сообщения WM_APP, сообщение рассматривал один раз. Для дальнейших описаний спрашивайте меня. Следуя коду процедуры ловушки и блока, который обрабатывает сообщения WM_APP. Спасибо

Процедура подключения

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;

person gc5    schedule 18.08.2011    source источник


Ответы (1)


Вероятно, это потому, что вы отправляете сообщение для WM_RBUTTONDOWN и WM_RBUTTONDOWN, то есть когда правая кнопка нажата и когда она отпущена.

Когда вы отлаживаете, WM_RBUTTONUP поглощается отладчиком, поэтому вы его не получаете.

PS: Разве вы не должны использовать PostMessage() вместо SendMessage(), просто на всякий случай?

person rodrigo    schedule 18.08.2011
comment
Вы правы :) Тем не менее, я проверил это лучше, процедура ловушки обрабатывается тем же потоком оконной процедуры, которая получает сообщение.. Я должен использовать и в этом случае PostMessage или я могу использовать SendMessage? msdn кажется, что я могу используйте SendMessage.. или я ошибаюсь? - person gc5; 18.08.2011
comment
Конечно, вы можете, и если вы используете тот же поток, с этим нет проблем. Но я предпочитаю свести код хука к минимуму, чтобы не мешать поведению других программ/потоков. PostMessage возвращается немедленно, так что вы можете без угрызений совести задержаться в основном цикле. - person rodrigo; 18.08.2011
comment
Учитывая, что это также глобальный хук с достаточными накладными расходами, это хорошая идея. Спасибо :) - person gc5; 18.08.2011