对提示框发送回车, sendmessage 和 postmessage 的区别
google了很多, 好像没怎么见到类似的提问
一个外部程序的消息框发送回车, 这个消息框上有个确定按钮,外部程序被hook
send是等回应再返回 和 post是不管如何执行马上返回, 请问前辈们, 这里一定不能用send吗?
应该跟被hook无关的, 我弄个临时工程发送也是同样效果
还就是, 用post发送消息后就不管了, 这个消息应该也是迟早都要被执行的吧, 有没有什么情况会被忽视?
当然我也可以找到这个按钮句柄再发送点击, 但此贴就想知道这个疑问的答案, 谢谢各位路过的前辈
sendmessage没反应
SendMessage(消息框Handle, WM_KEYDOWN, VK_RETURN, 0);
SendMessage(消息框Handle, WM_KEYUP, VK_RETURN, 0);
postmessage可以响应
PostMessage(消息框Handle, WM_KEYDOWN, VK_RETURN, 0);
PostMessage(消息框Handle, WM_KEYUP, VK_RETURN, 0);
[解决办法]
看你要不要返回.
不返回的话, 当然是 POST啦.
比如你要等他返回了, 再干其他的事情. 就用Send
另外, 你post的是个指针, 刚好引用了你的一个局部地址, 这个时候如果函数执行完毕的话, 这一块地址就可能乱码了. 但是用send等返回 函数才能执行完毕,就不会乱
[解决办法]
主要的区别,postmessage 返回值只是一个bool,只用来确认消息是否发送到达;
而 sendmessage返回值是个DWORD,那这作用就多了,意味着可以返回32位的无符号整数,或指针...
例如下面的sendmessage可以获取一个句柄:
procedure TForm1.dtp1DropDown(Sender: TObject);
var
hwn: HWND;
begin
// 需要返回一个窗口句柄,必须用sendemessage
hwn := SendMessage(dtp1.Handle, $1000 + 8, 0, 0);
if hwn > 0 then
// 最后使用这个返回的句柄做为参数,但是接下来我不再需要返回什么信息了,post即可
PostMessage(hwn, $1000 + 15, 0, ord(dowMonday));
end;