• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    VB6中處理自定義窗口消息

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 37次 | 進入軟件測試論壇討論

    領測軟件測試網 作者: ZDNET CHINA 特稿

    vb程序間進行跨進程通信不是一件容易的事。我曾經見過許多的程序開發員試圖通過各種各樣的方法來完成這一工作,這些辦法包括從將信息寫入共享的文本文檔或注冊表鍵到使用成熟的activeX程序通信服務器。每一種辦法都有缺點:以前的辦法容易產生錯誤,而現在的這些方法又由于在服務器中呼叫每一個對象的時候都會發生跨進程操作,又使其效率變得非常低。有一個經過實踐檢驗的方法是,將要跨進程的通信掛接到你自己的VB程序的消息序列中,同時傾聽從其它進程中傳來的自定義窗口消息,一種被大家稱之為"子類"的技術。


    我曾經描述過如何以及為什么在VB編程語言中要運用"子類",而且我還展示了如何使用視窗應用編程接口來將消息發送到你的應用程序以及解鎖的隱藏控制功能中去。在本篇文章中,我會向大家解釋如何才能向其他的應用程序發送消息以及如何發送消息才能解決跨進程的通信難題。同時,我還會給大家提供可再度使用的ActiveX DLL, Messenger.dll,來讓各位在將自定義消息運用于自己的程序的時候盡可能的簡單起來。

    傳送信息時與其它程序之間的相互作用

    因為消息傳送是Windows和在它上面運行的程序之間通信的最基本方式,任何窗口或者控制任何的應用程序都可以通過使用SendMessage或者相關的軟件來發送消息。此外,那些標準的消息對于所有運行于Windows的應用程序都有著相同的含義。有了這兩點,我們就能得出一個令人吃驚的結論:通過發送消息,人們可以輕而易舉的控制任何的當前正在運行的應用程序,甚至還包括那些并不應該被別人操控的應用程序。舉個例子來說:


    當你使用WM_xBUTTONDOWN 以及 WM_xBUTTONUP來傳送消息的時候,你可以在別的應用程序中模擬鼠標的點擊操作。

    發送WM_KEYDOWN 以及 WM_KEYUP消息的時候,會模擬出按鍵盤的操作。

    有惡意的程序員能夠通過發送一條WM_CLOSE消息到最高級窗口來迫使其它的應用程序關閉,或者通過使用WM_ENDSESSION來讓其它的應用程序誤以為Windows操作系統正在關閉。

    指出你是在和誰談話

    發送消息到另一個窗口的關鍵并不取決于你的應用程序,而是取決于窗口句柄。Windows操作系統的應用編程接口有許多的功能能夠重新得到特定的窗口句柄,其中最經常使用的一個就是FindWindow功能。這個功能能夠在標題說明中找到基于文本的最高級別的窗口(lpWindowName),并且返回到它的窗口句柄。在VB編程語言中關于FindWindow是如下這么描述的:


    Private Declare Function FindWindow Lib "user32" _
    Alias "FindWindowA" (ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long


    找到子窗體

    你能通過使用FindWindowEx來找到子窗體句柄,就象是一個表格中的特殊控制一樣。



    自定義消息提供了一種共通的語言

      
    現在讓我們來復習一下:發送消息是一種簡單有效的與其它應用程序進行交流的方法,而且你能夠輕松的通過發送標準的Windows消息來模擬出用戶與圖形用戶界面程序之間的相互作用。但是,如果你需要分程傳遞一些非標準的消息到你的另一個也許已經準備就緒進行處理的程序的時候又該如何去做呢?當然,這是完全能夠做到的,重新定義一個標準消息的含義來表達"數據已經準備就緒,"使其它程序的主窗口子類化,并且對此消息進行特殊的處理。


    這么做真的有效果嗎?是的,答案是肯定的。但是這遠遠不是最佳的解決辦法。首先,你的數據處理程序不會對你決定進行重定義的任何消息做出像正常時一樣的反應。如果你能夠定義一條制有你的程序能夠明白的自定義消息的話,會比較好一些。


    令人感到愉快的是,RegisterWindowMessageAPI函數就是這樣的。你只需要傳遞給它一個單獨的文本消息標識符,剩下的工作就可以讓這個功能自己去完成了。其中的工作包括,向Windows注冊此消息,返回一條專門的消息標識符,這條專門的消息標識符必須被保證是唯一的而且對于當前的Windows是有益的。之后,用相同的消息標識符呼叫RegisterWindowMessage功能,無論是從相同的還是從不相同的程序中,會把這個分配給第一次呼叫的相同的標識符返回。VB編程語言對于RegisterWindowMessage有如下聲明:


    Private Declare Function RegisterWindowMessage _
    Lib "user32" Alias "RegisterWindowMessageA" _
    (ByVal lpString As String) As Long


    把碎片組合在一起

    這是解決跨進程通信的最后一塊碎片。任何需要從別的程序接收自定義消息的程序會子類化它的主窗口,并且提供一個單獨的窗口標題來讓它的hWnd能被FindWindow輕松的獲得。(第一個應用程序應該用另一種方法來定位第二個程序的hWnd。)兩個程序都注冊相同的自定義窗口消息,并且懸掛到他們接收到的標識符上去。當一個程序需要將自定義消息鎖代表的通知給另一個程序的時候,它會發現另一個程序的窗口句柄,并且通過使用SendMessage變量來發送自定義消息。任何額外的信息都會由于SendMessage注釋:swParam 以及lParam參數或者它的返回碼而相互聯絡。


    根據我所說的,我編了一個在VB6程序中能夠被用來實現自定義消息特別的Messenger組件。這個組件的源代碼可以從下邊的列表中找到:


    Listing A是這個組件主要類別的源代碼,cMessenger。

    為個人使用的源代碼被稱之為cMessageInfo,可以在Listing B中被找到。

    在Listing C中你能找到的是用來function addresses以及需要功能模塊的時候的組件源代碼。

    Messenger負責為用戶子類,注冊,接聽,以及發送自定義消息。這是相當安全的,因此,多個應用程序都能夠使用此組件的同一拷貝。


    StartListening方法被看作是一個窗口對子類的句柄中唯一的參量。它為此窗口嵌入它自己的窗口程序,并且開始等待你用RegisterMessage方法定義的自定義消息。這樣能夠通過提高IncomingMessage事件以及只回應你使用RegisterMessage注冊的自定義消息來確定是否收到一條自定義消息。在關閉窗口之前,通過使用StopListening功能,確保已經把cMessenger從窗口消息序列中去掉了。


    你可以使用SendMessage來傳送消息到其它的應用程序。SendMessage認可你希望通報的窗口標題,同時也認可你使用RegisterMessage注冊的消息文本。你能夠通過使用RegisterWindow或者 RegisterWindowByHandle手動將新的窗口添加到高速緩存中去。

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>