新聞中心
vb.net程序如何實現(xiàn)向電腦的Com口發(fā)送一段字符串信息,之后再接收顯示發(fā)送的字符串信息?
'vb.net的串口接收數(shù)據(jù)要用到委托
10年積累的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有蘇尼特左免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
Delegate Sub SetTextCallback(ByVal InputString As String) '聲明一個委派類,并聲明符合函數(shù)參數(shù)有一個,而其型態(tài)是字符串
Private Sub ShowString(ByVal comData As String)
txt_Re.Text = comData '將收到的數(shù)據(jù)入接收文字框中--- txt_Re.Text 是接收用的文本框
txt_Re.SelectionStart = txt_Re.Text.Length
txt_Re.ScrollToCaret()
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived‘自動接收事件
Dim inData As String = SerialPort1.ReadExisting
Dim d As New SetTextCallback(AddressOf ShowString)
Invoke(d, inData)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '發(fā)送指令
SerialPort1.Write("123")
End Sub
VB怎么向指定進(jìn)程發(fā)送按鍵消息
實現(xiàn)方法如下:
1、如果有窗口,使用API sendmessage 函數(shù)向主窗口發(fā)送消息。
2、使用鍵盤Hook模擬發(fā)送一個全局按鍵消息。
3、打開進(jìn)程,使用匯編注入輸入函數(shù)
各們,請教怎么使用vb.net編寫兩個進(jìn)程間消息
兩個方法
1.
要接收的窗口先使用FindWindow這個api獲得句柄
調(diào)用SetForegroundWindow使其獲得焦點并選中
調(diào)用.net方法:SendKeys.Send方法發(fā)送
2.使用API的SendInput
淺談VB.NET中的跨進(jìn)程消息鉤子
我們都知道在VB 里面可以用API函數(shù)來進(jìn)行子類化 以處理自身的窗體過程 如果跨進(jìn)程 這就麻煩了 由于我們的函數(shù)在我們的進(jìn)程中(廢話) 而目標(biāo)進(jìn)程的窗口的消息處理函數(shù)在目標(biāo)進(jìn)程(還是廢話) 所以只能想辦法把我們的代碼放到對方進(jìn)程中去執(zhí)行——并且要告知我們的進(jìn)程得到了什么消息 恐怕寫匯編就有點嚇人了 于是大家都寫DLL 其原理就是把回調(diào)函數(shù)放到一個DLL里面注入到對方進(jìn)程 DLL去修改目標(biāo)窗口的默認(rèn)處理函數(shù)——把消息發(fā)送給我們
當(dāng)然也有 另類 一點的 /ThueDownloads/index s上面有一個DLL包 其中含有一個dssubcls dll 用它 可以輕松的完成我們的工作 就像調(diào)用一個API一樣簡單 而且在我們的程序中使用回調(diào)函數(shù)!呵呵 省去了自己寫DLL的麻煩之后 這些好處足以吸引各位觀眾了吧?
好了 VB 的代碼大家可以在下載的壓縮包中找到 作者提供了一個以記事本為基礎(chǔ)的實例(在\dssubcls目錄下) 非常詳細(xì)無需詳細(xì)敘述了 關(guān)鍵是在VB NET里面如何使用它——如何聲明API 如何進(jìn)行回調(diào) 看用來子類化的API的VB 聲明先
Declare Function SubClass Lib dssubcls (ByVal HwndSubclass _Optional ByVal Address = _Optional ByVal OldStyle = _Optional ByVal NewStyle = _Optional ByVal Ext = _Optional ByVal SubClass = )轉(zhuǎn)化成VB NET的聲明類似下面的樣子(習(xí)慣使然 我把展開成了As Integer)
Declare Function SubClass Lib dssubcls (ByVal HwndSubclass As Integer Optional ByVal Address As Integer = Optional ByVal OldStyle As Integer = Optional ByVal NewStyle As Integer = Optional ByVal Ext As Integer = Optional ByVal SubClass As Integer = ) As Integer
這不是很好嘛?問題來了 這樣的聲明在VB 里面可以使用Addressof function來傳入第二個參數(shù)(參見你下載的源碼) 但是在VB NET里面直接Addressof就不成了——我們需要委托一個回調(diào)
Private Delegate Function HookCallBack(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As Integer
這個委托 對應(yīng)的是以下函數(shù)
Private Function mCallback(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As Integer 在這里處理得到的消息
End Function
使用時 需要注意先實例化這個委托
Private fix_COCD = New HookCallBack(AddressOf mCallback)
此時 fix_COCD就是我們的mCallback函數(shù)引用了 用更直觀的觀點來看 fix_COCD就是一個指向mCallback的指針 相當(dāng)于VB 里面的Addressof function得到的結(jié)果 看似問題解決了 于是我們寫了以下代碼來搞對方的進(jìn)程窗體消息
SubClass(Handle fix_COCD ) 修改處理函數(shù)
問題真是接踵而至!IDE提示變量類型不符??!事實確實如此 我們把一個HookCallBack類型當(dāng)做Integer來傳遞 無法通過檢查 那么強(qiáng)行轉(zhuǎn)換吧?當(dāng)然 你可以去試試 這時 我所做的是 修改這個API聲明
Private Declare Function SubClass Lib dssubcls (ByVal HwndSubclass As Integer Optional ByVal Address As HookCallBack = Nothing Optional ByVal OldStyle As Integer = Optional ByVal NewStyle As Integer = Optional ByVal Ext As Integer = Optional ByVal SubClass As Integer = ) As Integet
使之符合我們的調(diào)用?有點倒行逆施?并非如此 當(dāng)你習(xí)慣了修改API聲明之后 會發(fā)現(xiàn)有些事變得如此簡單 有些事需要你重新認(rèn)識——對于WIN API也是如此
至此 大功告成
較為完整的代碼如下
CodePrivate Declare Function SubClass Lib dssubcls (ByVal HwndSubclass As Integer Optional ByVal Address As HookCallBack = Nothing Optional ByVal OldStyle As Integer = Optional ByVal NewStyle As Integer = Optional ByVal Ext As Integer = Optional ByVal SubClass As Integer = ) As IntegerPrivate Declare Function UseSendMessage Lib dssubcls (ByVal use As Integer) As Integer 實例化的委托Private fix_COCD = New HookCallBack(AddressOf mCallback) 委托Private Delegate Function HookCallBack(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As IntegerPublic Sub Hook(ByVal Handle As Integer)proc = SubClass(Handle fix_COCD ) 修改處理函數(shù)UseSendMessage( )End Sub
Private Function mCallback(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As Integer
End Function
用這個代碼的時候 可能會碰見一些 意外情況 例如wm_datacopy 此時 我們需要進(jìn)一步去獲取LPARTM所指向的結(jié)構(gòu)并對其進(jìn)行解析(我們要讀的是對方窗口所在進(jìn)程的內(nèi)存 具體地址由lParam確定——實際上lParam一直是一個指針——IntPrt 但它與Integer完全就是一回事(如果你使用VB 可能需要使用Intprt toint 或intprt=new intprt(integer)這些)
CodePublic Class GetMsgPublic Declare Function ReadProcessMemory Lib kernel (ByVal hProcess As Integer ByVal lpBaseAddress As Integer ByVal lpBuffer() As Byte ByVal nSize As Integer ByRef lpNumberOfBytesWritten As Integer) As IntegerPublic Declare Function ReadProcessMemory Lib kernel (ByVal hProcess As Integer ByVal lpBaseAddress As Integer ByRef int As Integer ByVal nSize As Integer ByRef lpNumberOfBytesWritten As Integer) As IntegerPublic Declare Function OpenProcess Lib kernel (ByVal dwDesiredAccess As Integer ByVal bInheritHandle As Integer ByVal dwProcessId As Integer) As IntegerPublic Declare Function CloseHandle Lib kernel (ByVal hObject As Integer) As IntegerPrivate hProc As IntPtrSub New(ByVal PID As Integer)hProc = OpenProcess(HFFFF False PID)End Sub
Function readmsg(ByVal address As Integer) As Byte()Dim buf( ) As ByteReadProcessMemory(hProc address buf )Return bufEnd Function
Protected Overrides Sub Finalize()CloseHandle(hProc)MyBase Finalize()End SubEnd Class這個類提供了Readmsg方法來讀取一些內(nèi)容——但這并不是完整的 我們知道 LPARAM指向的結(jié)構(gòu)是這樣的
_Public Structure COPYDATASTRUCTPublic dwData As IntegerPublic cbData As IntegerPublic lpData As IntPtrEnd Structure
其中dwData我們不是很關(guān)心 當(dāng)然其中也可能存在一些有用信息(這里不想多說 網(wǎng)上有些文章純屬誤導(dǎo))
而cbData是一個長度 lpData的長度
lpData這里被聲明為指針 看起來更直觀了——它就是地址
有了地址和長度 如何讀取代碼就自己寫吧
提示一下 參考我重載的ReadProcessMemory可能對你有不少幫助
當(dāng)然 上面提到的只是 特殊情況 中的一個典型 還有很多時候 進(jìn)程是用自定義消息(H A)來傳遞數(shù)據(jù)的 例如我所開發(fā)的這個工程 打印mCallBack的參數(shù)后 得到的是如下結(jié)果(十六進(jìn)制 只提取了有用的信息)
D
其中l(wèi)Param就是一個指針 我讀了其中的一部分
Function readmsg(ByVal address As Integer) As Byte()Dim buf( ) As ByteReadProcessMemory(hProc address buf )Return bufEnd Function
現(xiàn)在就明白為什么上面的代碼是那樣了 )
然后進(jìn)行了一個處理 得到了我想要的信息
消息解碼后得到的移動棋子信息 玩家 起X 起Y 止X 止Y 棋子編號
走棋總步數(shù)Event Move(ByVal player As Byte ByVal sx As Byte ByVal sy As Byte ByVal dx As Byte ByVal dy As Byte ByVal name As Byte ByVal [step] As Byte)Private Function mCallback(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As IntegerIf wParam = H ThenDim s As Byte() = msg readmsg(lParam)RaiseEvent Move(s( ) s( ) s( ) s( ) s( ) s( ) s( ))End IfEnd Function
當(dāng)然 在我的工程里面重載的ReadProcessMemory并沒有被使用
補(bǔ)充一下咯
在VB NET中 處理自己的窗體的消息只需要重載窗體消息處理過程就可以了 無需子類化 )
有補(bǔ)充一下
lishixinzhi/Article/program/net/201311/12647
網(wǎng)站欄目:vb.net進(jìn)程發(fā)消息 vbnet raiseevent
當(dāng)前地址:http://fisionsoft.com.cn/article/dosjcjo.html