send[C語言函式]

send[C語言函式]
更多義項 ▼ 收起列表 ▲

send是一個C語言函式,可以用於向視窗傳送非PowerBuilder預定義事件的訊息。

基本信息

原理及用法

用法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()

相關詞條

相關搜尋

熱門詞條

聯絡我們