sendmessage与postmessage有什么区别
看时间过去好久了。楼上都说的很好了,再给你形象的解释下,为后来人解读下把。。
PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。
PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;
而SendMessage必须等待其他程序处理消息后才返回,继续执行。
这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确----BOOL,
而SendMessage的返回值表示其他程序处理消息后的返回值---LRESULT。
PostMessage 是将消息发送到窗口的消息队列中,然后立即返回
SendMessage是将消息发送到窗口函数,在窗口函数处理完消息后才返回。 所以,PostMessage 是异步处理,而SendMessage是同步处理
先来看看Send与Post这两个英文单词的意思:Send有发送的意思,而Post具有投寄的意思。
联想一下现实生活中我们写信(很久很久以前。。。。)来记就很简单了:
Send: 相当于邮寄员,他会将快件亲手交给收件人,并且需要收件人签字,他才闪人。而在消息机制中,就是说,系统(邮寄员)会将收到的消息(邮局分发)直接发送到某个窗口的窗口过程(收件人),并且需要该窗口作出处理(收件人签字)才返回。 这东东就是SendMessage
Post: 相当于邮局、邮筒等等,我们写好信好,会将信交给邮局,或投寄到邮筒里,而什么时候发送,发送到哪里都由邮局来处理,我们投寄信件的时候,是不会等候这封信件到达收件人手里,然后才回家的。 而在消息机制中,就是说,系统(我们)将收到的消息(信件)投寄到应用程序的消息循环(相当于邮筒)中,然后就闪人,具体啥时候处理这条消息(啥时候发送邮件),那就得看“办事效率”了。
区别很明显,SendMessage的消息是不进队列的,而PostMessage的需要排队。
但,值得说明的是:虽然一个要进队,一个不进队,但是最终处理消息的地方都一样:都是系统调用窗口过程进行处理(收件人作出反应)
PostMessage和SendMessage有什么区别
其实你在网上搜索一下就可以找到很多答案!难道网上的回答都满足不了你,那你指望我们就能让你理解吗?
我把我的理解说一下,希望你懂。
1.SendMessage你就把他理解为调用窗口过程函数即可。
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
这个好懂吧!把他们等同即可,SendMessage就是 调用WindowProc,SendMessage的返回值就是WindowProc的返回值。
2。PostMessage就比较麻烦。
PostMessage后,系统会把消息放在程序的消息队列。
之后消息循环(这个在win32程序经常看到的)
While(GetMessage(。。。。))
{
。。。。
DispatchMessage(。。。);
}
GetMessage会获取到这个消息。
(对于很多初学者来说这个GetMessage确实不要理解,
因为它跟我们平常的程序代码执行思想很不同。
Getmessage有时会堵塞,程序会停在那里。
它什么时候被调用,谁调用它呢?--其实这都是系统的事,
系统发现程序的消息队列有消息了,就会让你的程序调用
Getmessage,把消息取出来,while循环继续执行,到
DispatchMessage时就可以把它等同于调用窗口过程函数
WindowProc了。
整理一下思路就是:
PostMessage=
消息进入消息队列-》GetMessage把消息取出来-》程序执行到DispatchMessage-》DispatchMessage就相当于调用窗口过程函数了
所以2个函数最后都会去调用窗口过程函数,只是PostMessage调用前要经历一些“曲折”的步骤。
“send”是什么意思?
send英 [send] 美 [sɛnd] 考研 / CET6 / CET4 / vt.送; 使作出(某种反应); 派遣; 使进入(某状态)vt.& vi.用无线电波发送,发出信息;vi.派遣,发出,派人;adj.[仅用作定语]用于发送的;变形过去式: sent 过去分词: sent 现在分词: sending 第三人称单数: sends1."I want to send a telegram." — "Fine, to whom?" “我想发份电报。”——“好的,发给谁?”2.For more details about these products, send a postcard marked HB/FF. 要了解这些产品的详细信息,请寄来标明HB/FF字样的明信片。3.Come on, Bill. Send Tom a card and make his day. 来吧,比尔。给汤姆寄张卡片让他高兴高兴吧。
send a message是什么意思
send a message
[英][send ə ˈmesidʒ][美][sɛnd e ˈmɛsɪdʒ]
(含蓄或通过行动)表达重要意思;
以上结果来自金山词霸
例句:
1.
Any process can send a message to a registered process.
任意的进程都可以发送消息给注册进程。
2.
Every day I send a message to good effect.
我每天都在发送邮件效果相当不错
vc中怎么使用SendMessage自定义消息函数
SendMessage的基本结构如下:SendMessage(HWNDhWnd,//消息传递的目标窗口或线程的句柄。UINTMsg,//消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,)WPARAMwParam, //参数1 (WPARAM 其实是与UINT是同种类型的,//在vc编译器中右键有个“转到WPARAM的定义”的选项可以查看。LPARAMlParam); //参数2其中一些参数的由来如下://typedef unsigned int UINT;//typedef UINT WPARAM;//typedef LONG LPARAM;//typedef LONG LRESULT;例如可以用以下语句:::SendMessage(this-m_hWnd, WM_MY_DOSOME, (WPARAM) 0, (LPARAM)0);这里我发送的消息是本窗体接收的,所以句柄用:this-m_hWnd这里的消息类别WM_MY_DOSOME就是我自定义的,在接收消息的窗体或线程所在的头文件里:#define WM_MY_DOSOMEWM_USER+1//do something当然你还可以定义更多如:
请教SendMessageEM
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
const int WM_SETTEXT = 0x000C;
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
private void button1_Click(object sender, EventArgs e)
{
SendMessage(this.textBox1.Handle,WM_SETTEXT,(IntPtr)0,"A");
}
}
}
求sendmessage的所有消息常数
★WM_CREATE 创建一个窗口
★WM_DESTROY 当一个窗口被破坏时发送
★WM_MOVE 移动一个窗口
★WM_SIZE 改变一个窗口的大小
★WM_ACTIVATE 一个窗口被激活或失去激活状态
★WM_SETFOCUS 一个窗口获得焦点
★WM_KILLFOCUS 一个窗口失去焦点
★WM_ENABLE 一个窗口改变成Enable状态
★WM_SETREDRAW 设置窗口是否能重画
★WM_SETTEXT 应用程序发送此消息来设置一个窗口的文本
★WM_GETTEXT 应用程序发送此消息来复制对应窗口的文本到缓冲区
★WM_GETTEXTLENGTH 得到与一个窗口有关的文本的长度(不包含空字符)
★WM_PAINT 要求一个窗口重画自己
★WM_CLOSE 当一个窗口或应用程序要关闭时发送一个信号
★WM_QUERYENDSESSION 用户选择结束对话框或程序自己调用ExitWindows函数
★WM_QUIT 用来结束程序运行
★WM_QUERYOPEN 用户窗口恢复以前的大小位置时,把此消息发送给某个图标
★WM_ERASEBKGND 当窗口背景必须被擦除时(例在窗口改变大小时)
★WM_SYSCOLORCHANGE 当系统颜色改变时,发送此消息给所有顶级窗口
★WM_QUERYENDSESSION 消息后,此消息发送给应用程序,通知它对话是否结束
★WM_SHOWWINDOW 当隐藏或显示窗口是发送此消息给这个窗口
★WM_ACTIVATEAPP 发此消息给应用程序哪个窗口是激活的,哪个是非激活的
★WM_FONTCHANGE 当系统的字体资源库变化时发送此消息给所有顶级窗口
★WM_TIMECHANGE 当系统的时间变化时发送此消息给所有顶级窗口
★WM_CANCELMODE 发送此消息来取消某种正在进行的摸态(操作)
★WM_SETCURSOR 如果鼠标引起光标在某个窗口中移动
★WM_ENDSESSION 当系统进程发出且鼠标输入没有被捕获时,就发消息给某个窗口
★WM_MOUSEACTIVATE 当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
★WM_CHILDACTIVATE 送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
★WM_QUEUESYNC 此消息由基于计算机的训练程序发送,通过 WH_JOURNALPALYBACK的hook程序分离出用户输入消息
★WM_GETMINMAXINFO 此消息发送给窗口当它将要改变大小或位置
★WM_PAINTICON 发送给最小化窗口当它图标将要被重画
★WM_ICONERASEBKGND 此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
★WM_NEXTDLGCT★发送此消息给一个对话框程序去更改焦点位置
★WM_SPOOLERSTATUS 每当打印管理列队增加或减少一条作业时发出此消息
★WM_DRAWITEM 当button,combobox,listbox,menu的可视外观改变时发送
★WM_MEASUREITEM 当button, combobox, listbox, listview control, or menuitem 被创建时
★WM_VKEYTOITEM 此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
★WM_CHARTOITEM 此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
★WM_SETFONT 当绘制文本时程序发送此消息得到控件要用的颜色
★WM_GETFONT 应用程序发送此消息得到当前控件绘制文本的字体
★WM_SETHOTKEY 应用程序发送此消息让一个窗口与一个热键相关连
★WM_GETHOTKEY 应用程序发送此消息来判断热键与某个窗口是否有关联
★WM_QUERYDRAGICON 此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
★WM_COMPAREITEM 发送此消息来判定combobox或listbox新增加的项的相对位置
★WM_COMPACTING 显示内存已经很少了
★WM_WINDOWPOSCHANGING 发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
★WM_WINDOWPOSCHANGED 发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
★WM_POWER 当系统将要进入暂停状态时发送此消息
★WM_COPYDATA 当一个应用程序传递数据给另一个应用程序时发送此消息
★WM_CANCELJOURNA 当某个用户取消程序日志激活状态,提交此消息给程序
★WM_NOTIFY 当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
★WM_INPUTLANGCHANGEREQUEST 当用户选择某种输入语言,或输入语言的热键改变
★WM_INPUTLANGCHANGE 当平台现场已经被改变后发送此消息给受影响的最顶级窗口
★WM_TCARD 当程序已经初始化windows帮助例程时发送此消息给应用程序
★WM_HELP 此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
★WM_USERCHANGED 当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息
★WM_NOTIFYFORMAT 公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
PostMessage和SendMessage的区别
一、主体不同1、SendMessage:将指定的消息发送到一个或多个窗口。2、PostMessage:是Windows API(应用程序接口) 中的一个常用函数,用于将一条消息放入到消息队列中。二、特点不同1、SendMessage:为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。2、PostMessage:将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。三、规则不同1、SendMessage:指定要接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。2、PostMessage:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、 被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口。参考资料来源:百度百科-SendMessage参考资料来源:百度百科-PostMessage
VC中SendMessage和PostMessage的区别
1、PostMessage会将消息压入窗口所在线程的消息队列,然后返回;而SendMessage则不经过消息队列,SendMessage可认为是直接调用了该窗口的窗口过程,因此在我们需要获得消息处理后的返回值的时候,就要用到SendMessage。
例如:当在程序中指定如下使用:PostMessage(hWnd, WM_MSG,0,0),那么当程序执行到PostMessage的时候,仅将消息WM_MSG压入到创建hWnd所指窗口的那个线程的消息队列,然后程序将继续执行下去,而至于程序什么时候响应该消息,则要看那个线程什么时候得到控制权;
而指定如下使用:SendMessage(hWnd, WM_MSG,0,0),那么当程序执行到该处时,将发生一次跳转:从当前位置,跳转到hWnd的窗口过程中去响应WM_MSG消息,当消息处理结束,窗口过程返回,程序又将从SendMessage后面继续执行,当然,我们可以获得窗口过程对该消息的处理结果,也即取SendMessage的返回值。(这里只是针对单线程)。
2、在多线程应用中,PostMessage的用法还是一样,但SendMessage则不同了。如果在线程A中向线程B所创建的一个窗口hWndB发送消息SendMessage(hWndB,WM_MSG,0,0),那么系统将会立即将执行权从线程A切换到线程B,然后在线程B中调用hWndB的窗口过程来处理消息,并且在处理完该消息后,执行权仍然在B手中!这个时候,线程A则暂停在SendMessage处,等待下次线程A获得执行权后才继续执行,并且仍然可以获得消息处理的结果(返回值)。一般,为了避免死锁,在B中对WM_MSG做出处理之前,要加上: if(InSendMessage())
RelpyMessage(lResult);
即判断:如果该消息是发自另外一个线程,则立即 RelpyMessage,回复消息,参数lResult即是返回值。而如果是在同一个线程内,则InSendMessage()将会返回FALSE。
sendmessage C# 鼠标点击
WM_LBUTTONDOWN和WM_LBUTTONUP是sdk种定义的常量,c/c++专用,所以你得自己重定义从网上粘来的,参考下 public enum WMessages : int { WM_LBUTTONDOWN = 0x201, //Left mousebutton down WM_LBUTTONUP = 0x202, //Left mousebutton up WM_LBUTTONDBLCLK = 0x203, //Left mousebutton doubleclick WM_RBUTTONDOWN = 0x204, //Right mousebutton down WM_RBUTTONUP = 0x205, //Right mousebutton up WM_RBUTTONDBLCLK = 0x206, //Right mousebutton doubleclick WM_KEYDOWN = 0x100, //Key down WM_KEYUP = 0x101, //Key up }
vb中sendmessage函数的用法
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SETTEXT = &HC
Private Sub Command1_Click()
SendMessage Text1.hwnd, WM_SETTEXT, 0, ByVal "hello"
End Sub
SendMessage参数个数究竟是三个还是四个
很多语言都有 SendMessage。 参数有多有少。
有些语言有 重名函数,即同样的 函数名字,但 形式参数个数不同 ,例如 可以 3个 也 可以 4个。当 实际参数 给 3 个 时,就 调用 形参为 3个 的 同名函数,实际参数 给 4 个 时,就 调用 形参为 4个 的 同名函数。
参考 百度百科:
http://baike.baidu.com/item/SendMessage/6374103
SendMessage函数是干什么用的?有哪些参数?
是向一个指定的窗口发送一条指定的消息
它有4个参数
第一个,是指定的窗口的句柄,这个窗口是广义上的,也就是说包括各种控件,对话框。它指明你到底要向谁发送消息
第二个,是具体的消息,你要向这个窗口发送一条什么样的消息,要在这说明,消息是由微软给定义好的以WM_开头,比如WM_SETFOCUS设置输入焦点。有很多,你可以查看MSDN
第三个和第四个参数,这两个和第二个参数有关,它们都是消息的附加参数,具体是什么类型的要看消息是什么,MSDN中对每个消息的附加参数都写的很明确。
比如WM_GETTEXT该消息用于获取窗口中的内容。它的附加参数,一个是字符数组,用于接收这个文本。一个是接收文本的大小,假如获取的文本超过这个值就舍弃。
还有很多你可以看看MSDN
C#如何接收sendmessage发出的消息
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch(m.Msg)
{
case WM_GETTEXT:
。。。。。。。。。。。。。
break;
default:
base.DefWndProc(ref m);
break;
}
}