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