新闻资讯
看你所看,想你所想

send(C语言函式)

send(C语言函式)

send是一个C语言函式,可以用于向视窗传送非PowerBuilder预定义事件的讯息。

基本介绍

  • 中文名:传送
  • 外文名:send
  • 学科:计算机
  • 用途:C语言

原理及用法

用法Send()函式用于向视窗传送非PowerBuilder预定义事件的讯息,这个视窗可以是PowerBuilder套用的视窗,也可以是其它套用的视窗。Send()函式直接触发指定视窗相应的事件,执行事件处理程式后返回到调用套用中,这一点与Post()函式不同,Post()函式把传送的讯息放置在指定视窗讯息伫列的尾部,然后返回到应用程式中,它并不等待相应事件事件处理程式的执行。因此,我们说Post()函式採用的是异步方式,Send()函式採用的是同步方式。Send()函式的参数handle指定接收讯息的视窗句柄,对PowerBuilder视窗来说,使用Handle()函式可以得到该句柄。对其它应用程式的视窗来说,可以调用系统API函式查找视窗并得到相应视窗的句柄。实际上,Send()函式把它的各个参数直接传送给Windows的系统调用SendMessage()。在各种C++开发工具的WINDOWS.H档案中可以查到各讯息编号。如果应用程式要传送PowerBuilder定义事件(包括预定义事件和用户定义事件),那幺使用TriggerEvent()函式既简单有方便。当应用程式在long参数位置指定一个字元串时,Send()函式複製一个该字元串的副本,然后将副本的地址传送给指定视窗
参数:
按键 要传送的按键序列。
标誌 [可选参数] 更改程式处理“按键”的方式:
标誌 = 0 (默认),按键序列中含有的特殊字元比如 + 和 ! 将被视为 SHIFT 和 ALT 键。
标誌 = 1,按键将按原样传送。
返回值
注意
AutoIt 可传送所有的 ASCⅡ 码及扩展 ASCⅡ 码字元(0-255),若要传送 UNICODE 编码的字元则必须使用“ASC”选项加上您要传送的字元代码(见下面的 {ASC})。
“Send” 命令的语法跟 ScriptIt 以及 Visual Basic 的 “SendKeys” 命令类似。字元序列将按原文传送,但下列字元除外:
'!'
表示告知 AutoIt 要传送一个 ALT 键击动作,因此语句 Send("This is text!a") 的意思是按序传送按键 "This is text" 然后在按下"ALT+a"。
注意,有些程式对大小写字元和 ALT 键相当挑剔,举例来说,"!A" 可能会被认为不同于 "!a";第一个代表 ALT+SHIFT+A,而第二个则代表 ALT+a。如果拿不準的话最好使用小写!
'+'
表示告知 AutoIt 要传送一个 SHIFT 键击动作,因此语句 Send("Hell+o") 的意思是按序传送按键 "HellO"。Send("!+a") 表示传送 "ALT+SHIFT+a"。
'^'
表示告知 AutoIt 要传送一个 CONTROL 键击动作,因此语句 Send("^!a") 的意思是传送按键 "CTRL+ALT+a"。
注意,有些程式对大小写字元和 CTRL 键相当挑剔,举例来说,"^A" 可能会被认为不同于 "^a";第一个代表 CTRL+SHIFT+A,而第二个则代表 CTRL+a. 如果拿不準的话最好使用小写!
'#'
井号将传送一个 Windows 徽标键,因此语句 Send("#r") 将传送 Win+r,这将打开“运行”对话框。
您可以通过设定 SendCapslockMode 从而在 Send 函式开始操作前关闭大小写切换键(大写锁,CAPS LOCK)并在完成操作后恢复。
但是,如果在 Send 函式开始执行的时候用户就按住 Shift 键,那幺传送的文本可能会是小写字元。
一个解决办法是在每次执行其它 Send 操作前使用语句 Send("{SHIFTDOWN}{SHIFTUP}")。
某些特殊按键必须用花括弧括住才能传送:
注意,Windows 不允许模拟 "CTRL-ALT-DEL" 组合键!
Send 命令(无标誌参数) 键击结果
{!} !
{#} #
{+} +
{^} ^
{{} {
{}} }
{SPACE} 空格
{ENTER} 主键盘区的 回车键
{ALT} ALT
{BACKSPACE} 或 {BS} 退格
{DELETE} 或 {DEL} 删除(DELETE)
{UP} 向上箭头
{DOWN} 向下箭头
{LEFT} 向左箭头
{RIGHT} 向右箭头
{HOME} HOME
{END} END
{ESCAPE} 或 {ESC} ESC键
{INSERT} 或 {INS} INS(Insert)
{PGUP} PageUp
{PGDN} PageDown
{F1} - {F12} 功能键
{TAB} TAB
{PRINTSCREEN} Print Screen key
{LWIN} 左徽标键
{RWIN} 右徽标键
{NUMLOCK on} NUMLOCK (on/off/toggle)(开/关/切换)
{CAPSLOCK off} CAPSLOCK (on/off/toggle)(开/关/切换)
{SCROLLLOCK toggle} SCROLLLOCK (on/off/toggle)(开/关/切换)
{CTRLBREAK} Ctrl+Break
{PAUSE} PAUSE
{NUMPAD0} - {NUMPAD9} 数字键盘上的 数字键
{NUMPADMULT} 数字键盘上的 乘号
{NUMPADADD} 数字键盘上的 加号
{NUMPADSUB} 数字键盘上的 减号
{NUMPADDⅣ} 数字键盘上的 除号
{NUMPADDOT} 数字键盘上的 点号
{NUMPADENTER} 数字键盘上的 回车键
{APPSKEY} Windows 应用程式键
{LALT} 左 ALT 键
{RALT} 右 ALT 键
{LCTRL} 左 CTRL 键
{RCTRL} 右 CTRL 键
{LSHIFT} 左 Shift 键
{RSHIFT} 右 Shift 键
{SLEEP} 系统休眠(SLEEP)键
{ALTDOWN} 按住 ALT 键直到传送 {ALTUP} 为止
{SHIFTDOWN} 按住 SHIFT 键直到传送 {SHIFTUP} 为止
{CTRLDOWN} 按住 CTRL 键直到传送 {CTRLUP} 为止
{LWINDOWN} 按住左徽标键直到传送 {LWINUP} 为止
{RWINDOWN} 按住右徽标键直到传送 {RWINUP} 为止
{ASC nnnn} 传送 ALT+nnnn 组合键
{BROWSER_BACK} 仅支持2000/XP:按下浏览器中的“后退”按钮
{BROWSER_FORWARD} 仅支持2000/XP:按下浏览器中的“前进”按钮
{BROWSER_REFRESH} 仅支持2000/XP:按下浏览器中的“刷新”按钮
{BROWSER_STOP} 仅支持2000/XP:按下浏览器中的“停止”按钮
{BROWSER_SEARCH} 仅支持2000/XP:按下浏览器中的“搜寻”按钮
{BROWSER_FAVORITES} 仅支持2000/XP:按下浏览器中的“收藏夹”按钮
{BROWSER_HOME} 仅支持2000/XP:运行浏览器并转到主页
{VOLUME_MUTE} 仅支持2000/XP:切换系统静音状态
{VOLUME_DOWN} 仅支持2000/XP:减小系统音量
{VOLUME_UP} 仅支持2000/XP:增大系统音量
{MEDIA_NEXT} 仅支持2000/XP:在播放器中选择播放下一个轨道(影音媒体)
{MEDIA_PREV} 仅支持2000/XP:在播放器中选择播放上一个轨道
{MEDIA_STOP} 仅支持2000/XP:使播放器停止播放
{MEDIA_PLAY_PAUSE} 仅支持2000/XP:使播放器播放/暂停
{LAUNCH_MAIL} 仅支持2000/XP:运行邮件客户端程式
{LAUNCH_MEDIA} 仅支持2000/XP:运行播放器(Media player)
{LAUNCH_APP1} 仅支持2000/XP:运行用户程式1(我的电脑)
{LAUNCH_APP2} 仅支持2000/XP:运行用户程式2(计算器)
如果要传送 ASCⅡ 字元 A 则参考下例(相当于 ALT+065,按住ALT键并在数字键盘上顺序按下065)
Send("{ASC 065}")
(在使用两位数的 ASCⅡ 码时必须在前面加一个 0,否则将使用 437号代码页)。
如果要传送 UNICODE 字元则输入该字元代码,例如下例将传送一个中文字元
Send("{ASC 2709}")
可参考下例重複传送某按键:
Send("{DEL 4}") ;连续4次按下 DEL 键
Send("{S 30}") ;传送30个字元“S”
Send("+{TAB 4}) ;连续4次按下 SHIFT+TAB
如果要按住(保持按下状态)某个按键(通常用于游戏中)
Send("{a down}") ;按住按键 A
Send("{a up}") ;鬆开按键 A
如果要改变 capslock、numlock 和 scrolllock 键的状态,可参考下例:
Send("{NumLock on}") ;打开 NumLock
Send("{CapsLock off}") ;关闭 CapsLock
Send("{ScrollLock toggle}") ;切换 ScrollLock 的状态
如果要用变数来指定重複传送的次数,参考下例:
$n = 4
Send("+{TAB " & $n & "}")
如果要用变数来指定要重複传送的 ASCⅡ 字元(比如 A),参考下例:
$x = Chr(65)
Send("{" & $x & " 4}")
大多数笔记本电脑的键盘上都会有一个特殊的 Fn 键,此键无法被模拟。
注意,若把标誌参数的值设为1则“按键”参数将被原样传送。如果某些文本是从变数里拷贝而来,而您又希望完全按原样传送这些文本的话,就应该使用这一设定。
例如,先打开 资料夹选项视窗(位于控制台),然后请尝试执行下面这些语句:
Send("{TAB}") 切换到(焦点切换)下一个控制项(按钮、複选框等)
Send("+{TAB}") 切换到上一个控制项
Send("^{TAB}") 切换到下一个视窗标籤
Send("^+{TAB}") 切换到上一个视窗标籤
Send("{SPACE}") 可用来切换複选框的选中状态或点击某个按钮
Send("{+}") 通常用来选中某个複选框(如果它“确实是”複选框的话)
Send("{-}") 通常用来取消选中某个複选框
Send("{NumPadMult}") 完全展开 SysTreeView32 控制项内显示的资料夹
组合 Alt 键使用可访问选单项,请打开记事本视窗然后尝试执行下面这些语句:
Send("!f") 表示传送 Alt+f,这是打开记事本的档案选单的快捷键,您还可以试试其它的!
Send("{DOWN}") 移动焦点到下一个选单项
Send("{UP}") 移动焦点到上一个选单项
Send("{LEFT}") 切换到左边的选单或收缩子选单
Send("{RIGHT}") 切换到右边的选单或展开子选单

LinuxC函式

经套接字传送讯息
相关函式
sendto,sendmsg,recv,recvfrom,recvmsg,socket
表头档案
#include < sys/socket.h >
定义函式
ssize_t send (int s,const void *msg,size_t len,int flags);
参数说明
第一个参数指定传送端套接字描述符;
第二个参数指明一个存放套用程式要传送数据的缓冲区;
第三个参数指明实际要传送的数据的字元数;
第四个参数一般置0。
函式说明
send() 用来将数据由指定的 socket 传给对方主机。使用 send 时套接字必须已经连线。send 不包含传送失败的提示信息,如果检测到本地错误将返回-1。因此,如果send 成功返回,并不必然表示连线另一端的进程接收数据。所保证的仅是当send 成功返回时,数据已经无错误地传送到网路上。
对于支持为报文设限的协定,如果单个报文超过协定所支持的最大尺寸,send 失败并将 errno 设为 EMSGSIZE ;对于位元组流协定,send 会阻塞直到整个数据被传输。
flags 参数有如下的选择:
MSG_DONTROUTE 勿将数据路由出本地网路
MSG_DONTWAIT 允许非阻塞操作(等价于使用O_NONBLOCK)
MSG_EOR 如果协定支持,此为记录结束
MSG_OOB 如果协定支持,传送带外数据
MSG_NOSIGNAL 禁止向系统传送异常信息
返回值
成功则返回实际传送出去的字元数,失败返回-1,错误原因存于errno 中。
错误代码
EBADF 参数 s 非法的 socket 处理代码。
EFAULT 参数中有一指针指向无法存取的记忆体空间。
WNOTSOCK 参数 s 为一档案描述词,非 socket。
EINTR 被信号所中断。
EAGAIN 此动作会令进程阻断,但参数 s 的 socket 为不可阻断的。
ENOBUFS 系统的缓冲记忆体不足。
EINVAL 传给系统调用的参数不正确。

windowsC函式

简述
向一个已连线的套接口传送数据。
#include <winsock.h>
int PASCAL FAR send( SOCKET s, const char FAR* buf, int len, int flags);
s:一个用于标识已连线套接口的描述字。
buf:包含待传送数据的缓冲区。
len:缓冲区中数据的长度。
flags:调用执行方式。
注释
send()适用于已连线的数据包或流式套接口传送数据。对于数据报类套接口,必需注意传送数据长度不应超过通讯子网的IP包最大长度。IP包最大长度在WSAStartup()调用返回的WSAData的iMaxUdpDg元素中。如果数据太长无法自动通过下层协定,则返回WSAEMSGSIZE错误,数据不会被传送。
请注意成功地完成send()调用并不意味着数据传送到达。
如果传送系统的缓冲区空间不够保存需传送的数据,除非套接口处于非阻塞I/O方式,否则send()将阻塞。对于非阻塞SOCK_STREAM类型的套接口,实际写的数据数目可能在1到所需大小之间,其值取决于本地和远端主机的缓冲区大小。可用select()调用来确定何时能够进一步传送数据。
在相关套接口的选项之上,还可通过标誌位flag来影响函式的执行方式。也就是说,本函式的语义既取决于套接口的选项也取决于标誌位。后者由以下一些值组成:
值意义
MSG_DONTROUTE 指明数据不选径。一个WINDOWS套接口供应商可以忽略此标誌;MSG_OOB 传送带外数据(仅适用于SO_STREAM;)。
返回值
若无错误发生,send()返回所传送数据的总数(请注意这个数字可能小于len中所规定的大小)。否则的话,返回SOCKET_ERROR错误,应用程式可通过WSAGetLastError()获取相应错误代码。
错误代码:
WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:WINDOWS套接口实现检测到网路子系统失效。
WSAEACESS:要求地址为广播地址,但相关标誌未能正确设定。
WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEFAULT:buf参数不在用户地址空间中的有效位置。
WSAENETRESET:由于WINDOWS套接口实现放弃了连线,故该连线必需被复位。
WSAENOBUFS:WINDOWS套接口实现报告一个缓冲区死锁。
WSAENOTCONN:套接口未被连线。
WSAENOTSOCK:描述字不是一个套接口。
WSAEOPNOTSUPP:已设定了MSG_OOB,但套接口非SOCK_STREAM类型。
WSAESHUTDOWN:套接口已被关闭。一个套接口以1或2的how参数调用shutdown()关闭后,无法再用send()函式。
WSAEWOULDBLOCK:
WSAEMSGSIZE:套接口为SOCK_DGRAM类型,且数据报大于WINDOWS套接口实现所支持的最大值。
WSAEINVAL:套接口未用bind()捆绑。
WSAECONNABORTED:由于逾时或其他原因引起虚电路的中断。
WSAECONNRESET:虚电路被远端复位。
参见:
recv(), recvfrom(), socket(), sendto(), WSAStartup()

转载请注明出处海之美文 » send(C语言函式)

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:ailianmeng11@163.com