2013-07-05 2 views
1

Я сделал небольшое приложение, которое отправляет текст в блокнот через SendMessage и EM_REPLACESEL.Как читать данные из lParam (значение указателя)

Теперь я пытаюсь подключить блокнот, чтобы получить значение EM_REPLACESEL (значение lParam и в этом случае текст «GET THIS TEXT»).

Picture from Spy++

EDIT: Смотреть эту картину: http://i.stack.imgur.com/8scNL.jpg

крючок работает отлично, моя проблема заключается для прослушивания сообщения EM_REPLACESEL и захватить значение из LPARAM. Так что теперь я хочу, чтобы перехватывать сообщения EM_REPLACESEL

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    Beep (2000,100); 
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam)); 
} 

:

Этот код работает отлично, при отправке сообщений в блокнот. Это не работы:

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == EM_REPLACESEL) 
    { 
     Beep (2000,100); 
    } 
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam)); 
} 

1) Как прослушивать сообщения EM_REPLACESEL?

2) Когда я получил сообщение о том, как получить значение lParam и, например, показать его в MessageBox. Что-то вроде этого:

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == EM_REPLACESEL) 
    { 
     MSG *lpMsg; 
     lpMsg = (MSG *) lParam; 
     MessageBox(NULL,(LPCWSTR)lpMsg,NULL,NULL); 
    } 
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam)); 
} 

Благодаря

ответ

3

EM_REPLACESEL является отправленное сообщение, не отправленное сообщение, так что вы должны использовать WH_CALLWNDPROC крюк вместо того, чтобы WH_GETMESSAGE крюк, например:

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HC_ACTION) { 
     CWPSTRUCT* cwps = (CWPSTRUCT*)lParam; 
     if (cwps->message == EM_REPLACESEL) { 
      Beep (2000,100); 
      // etc.. 
     } 
    } 
    return CallNextHookEx(g_hHook, nCode, wParam, lParam); 
} 

... = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, ...), 
+0

Отлично, Реми.Это работает.Спасибо.Как мне показать значение в Это поле для сообщений: MessageBox (NULL, (LPCWSTR) НВП, NULL, NULL); ? –

+1

'CWPSTRUCT' - это структура, а не строка. Вы не можете вывести его на 'LPCWSTR'. Чтобы извлечь текст из сообщения 'EM_REPLACESEL', вам нужно вместо этого называть поле' CWPSTRUCT :: lParam': 'if (IsUnicodeWindow (cwps-> hwnd)) MessageBoxW (NULL, (LPWSTR) cwps-> lParam, .. .); else MessageBoxA (NULL, (LPSTR) cwps-> lParam, ...); ' –

2

Ваш GetMsgProc() callback кодируется неправильно. Внимательно прочитайте связанную страницу MSDN, чтобы узнать, что означают аргументы обратного вызова. nCode аргумент не номер сообщения, он указывает, следует ли обрабатывать сообщение. Вы хотите использовать переданный lParam, чтобы восстановить сообщение, которое вы перехватили. Сделайте это похоже на это:

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HC_ACTION) { 
     MSG* pmsg = (MSG*)lParam; 
     if (pmsg->message == WM_LBUTTONDOWN) { 
      Beep (2000,100); 
      // etc.. 
     } 
    } 
    return CallNextHookEx(g_hHook, nCode, wParam, lParam); 
} 

Обратите внимание, что вы используете крюк WH_GETMESSAGE. Он работает только для сообщений, отправленных в очередь сообщений с помощью PostMessage(). Но EM_REPLACESEL - это сообщение, отправленное с помощью SendMessage(). Для этого требуется другой крючок WH_CALLWNDPROC или WH_CALLWNDPROCRET.

+0

Спасибо, Ганс. Наверное, вы имеете в виду MSG * pmsg = (MSG *) lParam, верно? Но это не работает, «Звуковой сигнал» никогда не называется. Если я перемещаю «Beep» перед «if (pmsg-> message == EM_REPLACESEL)», он работает. Но Spy ++ показывает, что EM_REPLACESEL отправляется в виде сообщений, поэтому я должен быть вызван в вашем примере. Любые намеки на то, что не так? –

+0

Справа. Подумайте об этом, вы, кажется, используете неправильный крючок. Ответ обновлен. –

+0

Изменил его на функцию CallWndProc CALLBACK (и изменил SetWindowsHook на g_hHook = SetWindowsHookEx (WH_CALLWNDPROC, CallWndProc, g_hInstDll, npThreadId), но у меня такая же проблема = нет звукового сигнала (Также пробовал это с CallWndRetProc) –

0

Так я обычно это делаю.

LRESULT CALLBACK GetMsgProc(MSG nCode, WPARAM wParam, LPARAM lParam) 
{ 
    while(GetMessage(&nCode, NULL, 0, 0) > 0) 
    { 
     if(nCode.message == EM_REPLACESEL) 
     { 
     //Do something 
     } 
     else 
     DispatchMessage(&nCode); 
    } 
    return 0; 
} 
+0

Спасибо Ayesha. Но я совместил SetWindowsHook (HOOKPROC) и как насчет функции CallNextHookEx в функции CALLBACK? –

Смежные вопросы