为什么给edit用sendmessage发送不了消息

时间:2020-12-03 19:32:58
我估计是发送给主窗口了  我在默认对话框工程上加了一个编辑框 起名为m_edit

在按钮里面写道

::SendMessage(m_edit.m_hWnd,WM_KEYDOWN,VK_BACK,0);

为什么不能发送??反而edit失去了焦点.

postmessage可以 我想请人解释一下

5 个解决方案

#1


跟具体的消息有关
键盘消息只能投递

#2


而且,只能在拥有焦点的情况下,才能接收并出来键盘消息

#3


m_edit.SendMessage(WM_CHAR, 'A', 1);

#4


m_edit.SendMessage(WM_CHAR, 8, 1);

#5


引用楼主 VsirSoft 的帖子:
我估计是发送给主窗口了  我在默认对话框工程上加了一个编辑框 起名为m_edit 

在按钮里面写道 

::SendMessage(m_edit.m_hWnd,WM_KEYDOWN,VK_BACK,0); 

为什么不能发送??反而edit失去了焦点. 

postmessage可以 我想请人解释一下 


给个标准答案
EDIT其实是不处理WM_KEYDOWN消息。但是它为什么会响应按键呢?
这是因为Windows会将WM_KEYxx等消息会通过TranslateMessage函数转换,并生成WM_CHAR消息放入消息队列。
它实际上处理的是WM_CHAR等消息。

再解释一下为什么PostMessage可以,而SendMessage不行
大家都知道PostMessage会将消息放入窗口所在线程的消息队列中,也就是说会经过TranslateMessage的处理

但是SendMessage非常特殊,如果目标窗口属于就是当前调用SendMessage的线程时,消息就不再经过消息队列,而是直接进入EDIT的窗口处理函数。
也就是说没有经过TranslateMessage,EDIT只收到WM_KEYDOWN,而收不到WM_CHARxxx等消息,所以没有效果

MSDN原文
If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message. 

#1


跟具体的消息有关
键盘消息只能投递

#2


而且,只能在拥有焦点的情况下,才能接收并出来键盘消息

#3


m_edit.SendMessage(WM_CHAR, 'A', 1);

#4


m_edit.SendMessage(WM_CHAR, 8, 1);

#5


引用楼主 VsirSoft 的帖子:
我估计是发送给主窗口了  我在默认对话框工程上加了一个编辑框 起名为m_edit 

在按钮里面写道 

::SendMessage(m_edit.m_hWnd,WM_KEYDOWN,VK_BACK,0); 

为什么不能发送??反而edit失去了焦点. 

postmessage可以 我想请人解释一下 


给个标准答案
EDIT其实是不处理WM_KEYDOWN消息。但是它为什么会响应按键呢?
这是因为Windows会将WM_KEYxx等消息会通过TranslateMessage函数转换,并生成WM_CHAR消息放入消息队列。
它实际上处理的是WM_CHAR等消息。

再解释一下为什么PostMessage可以,而SendMessage不行
大家都知道PostMessage会将消息放入窗口所在线程的消息队列中,也就是说会经过TranslateMessage的处理

但是SendMessage非常特殊,如果目标窗口属于就是当前调用SendMessage的线程时,消息就不再经过消息队列,而是直接进入EDIT的窗口处理函数。
也就是说没有经过TranslateMessage,EDIT只收到WM_KEYDOWN,而收不到WM_CHARxxx等消息,所以没有效果

MSDN原文
If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message.