我制作了一个小应用程序,通过SendMessage和EM_REPLACESEL将文本发送到记事本。
现在我正在尝试连接记事本以获取EM_REPLACESEL值(lParam值,在本例中为“获取此文本”文本)。
编辑:看到这张图片:http://i.stack.imgur.com/8scNL.jpg
钩子工作正常,我的问题是侦听EM_REPLACESEL消息并从lParam中获取值。
当邮件发送到记事本时,此代码可以正常工作:
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
Beep (2000,100);
return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}
所以现在我想拦截EM_REPLACESEL消息。 不工作:
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));
}
由于
答案 0 :(得分: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, ...),
答案 1 :(得分: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。
答案 2 :(得分: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;
}