複製鏈接
請複製以下鏈接發送給好友

send

(C語言函數)

鎖定
send是一個C語言函數,可以用於向窗口發送非PowerBuilder預定義事件的消息,send()函數直接觸發指定窗口相應的事件,執行事件處理程序後返回到調用應用中。
中文名
發送
外文名
send
學    科
計算機
用    途
C語言

send原理及用法

用法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}") 切換到右邊的菜單或展開子菜單

sendLinuxC函數

經套接字傳送消息
相關函數
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 傳給系統調用的參數不正確。

sendwindowsC函數

簡述
向一個已連接的套接口發送數據。
#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:虛電路被遠端復位。
參見: