青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

luqingfei@C++

為中華之崛起而崛起!
兼聽則明,偏聽則暗。

Win32匯編--窗口間的消息互發

 

窗口間的消息互發

 

在不同應用程序之間的窗口中可以互發消息,方法是通過SendMessage或者PostMessage函數,它們的用法如下:

       invoke PostMessage, hWnd, Msg, wParam, lParam

       invoke SendMessage, hWnd, Msg, wParam, lParam

 

對于不同的MsgwParamlParam的含義是不同的,如對于WM_SETTEXT是:

       wParam = 0;                                             //未定義,必須為0

       lParam = (LPARAM)(LPCTSTR)lpsz;         //要設置的字符串地址

 

 

想一想就會發現一個問題:Windows中不同應用程序的地址空間是隔離的,全市程序1要用SendMessage調用程序2所屬窗口的窗口過程,但程序2窗口過程的代碼并不在程序1的地址空間中,那么SendMessage如何調用它呢?其實很簡單,當程序1調用SendMessage函數的時候,Windows會先保存wParamlParam參數并等待,等輪到程序2的時間片的時候再去調用它的窗口過程,并把保存的wParamlParam參數發給它,等窗口過程返回的時候,Windows記下返回值并等待程序1,這樣程序1看上去就像自己直接在調用程序2的窗口過程一樣。

 

但又一個問題出現了:Windows在做“牽線紅娘”的時候傳遞了wParamlParam以及返回值,如果參數指向一個字符串呢,比如說上面的WM_SETTEXT消息中的lParam指向一個字符串,假設程序1lParam指向字符串的地址為xxxxxxxx,把這個地址傳給程序2的時候,程序2不可能訪問到程序1的地址空間,在程序2xxxxxxxx指向的可能是其他內容,也可能是不可訪問的,這又該如何處理呢?

 

寫一個源程序實驗一下,用一個程序向另一個程序的窗口發送WM_SETTEXT消息,然后在另一個程序中將接收到的WM_SETTEXT消息的參數顯示出來。先來打造接收程序,首先拷貝一份FirstWindows的代碼,然后在窗口過程的分支中加上以下代碼:

       .elseif      eax == WM_SETTEXT

                     invoke     wsprintf, addr szBuffer, addr szReceive, lParam, lParam

                     invoke     MessageBox, hWnd, offset szBuffer, addr szCaptionMain, MB_ok

 

同時在數據段中加上下列定義:

       szCaptionMain       db    ‘Receive Messag’,0

       szReceive              db    ‘Receive WM_SETTEXT message’,0dh,0ah

                                   db    ‘param: %08x’, 0dh, 0ah

                                   db    ‘text: “%s”, 0dh, 0ah, 0

 

在這里,要提及Win32 API中一個很常用的函數wsprintf,這是一個字符串格式化函數,可以將數值按指定格式翻譯成字符串,類似于C語言中的printf函數,它的原型是這樣的:

       int    wsprintf (

                     LPTSTR        lpOut,            //輸出緩沖地址

                     LPCTSTR      lpFmt             //格式化串地址

                                                            //變量列表

       );

變量列表的數目由格式化字符串規定,wsprintf處理格式化字符串,遇到普通的字符則直接拷貝到輸出,遇到%字符則代表有一個變量,%后面不同的字母表示不同的輸出格式,如%d表示輸出為整數,%x表示輸出為16進制,%s表示輸出字符串等。

 

%符號和表示格式的dxs等字母間可以用數字來指定輸出時占用的位長,這時輸出的位長不夠時函數會用空格填齊。另外,表示位長的數字前可以加0來表示填齊時用“0而非空格,如%08x表示輸出為8位前面用0填齊的16進制數。

 

wsprintfWin32 API中唯一一個參數數量不定的函數,使用wsprintf函數的時候,參數的數量取決于格式化字符串中用%號指定的數量,變量列表的數目和格式化串中的%格式一定要一一對應。這里szReceive中有兩個%號定義,那么后面就要額外跟兩個參數:

       invoke     wsprintf, addr szBuffer, addr szReceive, lParam, lParam

 

這條語句將lParam的數值以及lParam的字符串按照szReceive格式化串定義的格式轉換,并將結果存放到szBuffer中,然后程序將szBuffer中的內容在一個消息框中顯示出來:

       invoke     MessageBox, hWnd, offset szBuffer, addr szCaptionMain, MB_OK

執行程序寫好了,現在寫一個發送程序,如下所示:

                .386

                .model flat, stdcall

                option casemap:none

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include         windows.inc

include         user32.inc

includelib      user32.lib

include         kernel32.inc

includelib      kernel32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                .data

hWnd            dd          ?

szBuffer        db          256 dup (?)

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                .const

szCaption       db          'SendMessage',0

szStart         db          'Press OK to start SendMessage, param:%08x!',0

szReturn        db          'SendMessage returned!',0

szDestClass     db          'MyClass',0

szText          db          'Text send to other windows',0

szNotFound      db          'Receive Message Window no found!',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                .code

start:

                invoke FindWindow,addr szDestClass, NULL

                .if     eax

                        mov hWnd,eax

                        invoke wsprintf, addr szBuffer, addr szStart, addr szText

                        invoke MessageBox, NULL, offset szBuffer, offset szCaption, MB_OK

                        invoke SendMessage, hWnd, WM_SETTEXT, 0, addr szText

                        invoke MessageBox, NULL, offset szReturn, offset szCaption, MB_OK

                .else

                        invoke MessageBox, NULL, offset szNotFound, offset szCaption, MB_OK

                .endif

                invoke ExitProcess, NULL

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

end start

 

在這個程序中首先用FindWindow函數找到接收窗口的窗口句柄,FindWindow函數的使用方法是:

       invoke     FindWindow, lpClassName, lpWindowName

       .if           eax

                     mov hWin, eax

       .endif

 

兩個參數都指向字符串lpClassName指向需要尋找的窗口的窗口類,lpWindowName指向需要尋找窗口的窗口標題,如果目標窗口存在的話,函數的返回值是找到的窗口句柄,否則函數返回0

 

用接收窗口的窗口類當做參數尋找窗口,如果沒有找到則顯示“Receive Message Window not found”,找到的話則把“Text send to other windows”字符串的地址當做WM_SETTEXT消息的參數用SendMessage發送給接收窗口。

 

好!,現在發送開始,首先執行Receive.exe,窗口出來了,然后執行Send.exe,屏幕上出現一個對話框:Press OK to start SendMessage, param:00402072,表示在Send程序中字符串的地址是00402072h,現在單擊“確定”按鈕執行SendMessage函數,單擊后對話框消失,但接收程序顯示出了一個對話框,內容為:

       Receive WM_SETTEXT message

       param: 0012fflc

       text: “Text send to other windows”

 

可見字符串是正確地傳了過來,但地址卻不是發送程序的00402072h,這是為何?

答案是Window做“紅娘”做到底,它拷貝了WM_SETTEXT消息的lParam參數指向的字符串,并在接收程序的地址空間中開了一塊內存放上這個字符串,然后把新的地址值當做lParam傳給接收程序,畢竟在WM_SETTEXT消息中,lParam的數值是多少并不重要,重要的是它指向的字符串是否正確。

 

最后,單擊接收程序中的“確定”按鈕,發送程序馬上彈出一個消息框并顯示:SendMessage returned,這是SendMessage函數告訴我們:我回來了!

 

其實Windows在處理SendMessagePostMessage的時候要檢查消息的類型,并對不同的消息做不同的處理,當消息的參數是一個指針的時候,Windows要把指針指向的內容復制到緩沖區,以便在兩個程序的地址空間中傳遞。

 

注意:在用戶自定義的消息中(WM_USER等)不要在消息參數中傳遞指針,這只會引發非法訪問內存,因為Windows不知道用戶的意圖,它只會把lParamwParam當兩個普通的數值傳遞,而不會幫用戶把指針指向的內容復制到一個緩沖區中。

 

posted on 2010-08-18 13:04 luqingfei 閱讀(1015) 評論(0)  編輯 收藏 引用 所屬分類: Win32匯編程語言序設計

導航

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

統計

留言簿(6)

隨筆分類(109)

隨筆檔案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区激情视频| 国产精品视频九色porn| 久久久噜噜噜久噜久久 | 99综合精品| 99精品国产在热久久| 亚洲视频免费| 久久久精品动漫| 久久综合国产精品| 欧美精品综合| 国产精品稀缺呦系列在线| 国内精品久久久久影院薰衣草| 国产亚洲精品一区二555| 尤物99国产成人精品视频| 亚洲精品一区二区三| 亚洲一区二区少妇| 久久综合给合久久狠狠狠97色69| 美女露胸一区二区三区| 亚洲美女淫视频| 性久久久久久久久| 欧美激情亚洲激情| 国产日韩视频| 欧美亚洲免费| 老司机精品视频一区二区三区| 久久亚洲私人国产精品va| 亚洲国产一区二区三区在线播 | 亚洲国产精品一区在线观看不卡| 亚洲精品美女在线观看| 亚洲欧美日韩天堂| 欧美高清视频一区二区| 国产色综合天天综合网| 一本一本a久久| 久久人体大胆视频| 99精品视频网| 欧美二区乱c少妇| 国产一区二区三区高清在线观看| 91久久精品美女高潮| 香蕉久久夜色精品国产| 亚洲人成网站在线播| 久久国产一区二区三区| 国产精品久久毛片a| 亚洲美女性视频| 久久免费视频网站| 先锋影音一区二区三区| 国产精品久久影院| 国产精品99久久久久久宅男| 亚洲福利久久| 麻豆91精品91久久久的内涵| 国内外成人免费激情在线视频网站 | 久久精品一区二区| 中国日韩欧美久久久久久久久| 麻豆成人小视频| 激情久久一区| 久久综合色影院| 久久精品国产96久久久香蕉| 国产亚洲欧美aaaa| 久久久久**毛片大全| 欧美一级免费视频| 国产日韩三区| 久久久久国产一区二区| 午夜精品成人在线视频| 国产日韩一区在线| 久久久久久久久久久久久久一区 | 午夜视频在线观看一区二区| 亚洲精品久久久久久下一站 | 欧美激情亚洲自拍| 欧美国产精品劲爆| 亚洲人午夜精品免费| 亚洲第一黄网| 欧美全黄视频| 亚洲午夜激情免费视频| 一区二区三区 在线观看视频| 欧美日韩免费高清一区色橹橹| 一区二区久久| 亚洲欧美韩国| 影音先锋亚洲一区| 亚洲国产精品一区二区www| 欧美黄色aaaa| 亚洲一区二区视频在线| 亚洲亚洲精品三区日韩精品在线视频| 国产精品免费区二区三区观看| 亚洲欧美在线免费观看| 国产精品二区二区三区| 久久免费视频这里只有精品| 国产综合视频在线观看| 老色鬼久久亚洲一区二区| 久久久人成影片一区二区三区观看 | 亚洲欧洲在线播放| 欧美日韩在线免费| 久久精品噜噜噜成人av农村| 久热这里只精品99re8久| 日韩午夜激情av| 亚洲专区一区| 亚洲欧洲精品一区二区| 在线视频一区二区| 在线观看欧美激情| 亚洲最新在线| 亚洲高清影视| 亚洲激情电影在线| 狠狠色狠狠色综合| 欧美高清视频在线观看| 欧美日韩国产综合一区二区| 久久电影一区| 免费国产自线拍一欧美视频| 亚洲午夜激情| 老色鬼精品视频在线观看播放| 一区二区三区精品久久久| 欧美中文字幕第一页| 99国产精品国产精品毛片| 欧美一级黄色录像| 亚洲免费在线看| 欧美精品国产一区| 久久综合九九| 国产精品午夜国产小视频| 亚洲日本一区二区| 在线观看精品| 性欧美长视频| 亚洲欧美自拍偷拍| 久久免费视频一区| 亚洲一区二区三区在线观看视频| 麻豆精品精华液| 99re6这里只有精品视频在线观看| 国产精品午夜av在线| 亚洲激情第一区| 久久国产福利国产秒拍| 性欧美超级视频| 国产精品久久久久aaaa九色| 亚洲国产精品一区制服丝袜| 国产在线观看91精品一区| 中日韩视频在线观看| 在线视频日韩精品| 欧美日韩大陆在线| 亚洲国产cao| 亚洲国产精品成人综合色在线婷婷| 亚洲一区二区三区色| 亚洲一区二区免费| 欧美日韩国产一级| 午夜视频在线观看一区二区三区| 久久综合免费视频影院| 久久精品主播| 国产午夜亚洲精品不卡| 亚洲免费视频成人| 欧美在线观看视频一区二区| 欧美午夜欧美| 亚洲一级片在线看| 亚洲天堂免费观看| 国产精品视频第一区| 亚洲欧美网站| 久久五月激情| 91久久夜色精品国产网站| 欧美freesex8一10精品| 亚洲国产精品视频| 亚洲一区黄色| 国产婷婷成人久久av免费高清| 欧美在线视频一区二区三区| 久久久美女艺术照精彩视频福利播放| 国产最新精品精品你懂的| 亚洲精品日韩久久| 韩日精品中文字幕| 亚洲欧美卡通另类91av| 欧美一级大片在线观看| 国产日韩成人精品| 久久网站热最新地址| 亚洲国产精品免费| 亚洲一本视频| 黑人一区二区| 欧美激情久久久久久| 99国产精品99久久久久久| 欧美亚洲专区| 亚洲欧洲一区二区天堂久久 | 麻豆精品精品国产自在97香蕉| 亚洲国产欧美日韩精品| 亚洲一区二区三区免费视频 | 激情久久婷婷| 欧美色图一区二区三区| 欧美午夜寂寞影院| 日韩视频二区| 亚洲免费综合| 久久久亚洲高清| 欧美精品一区三区| 日韩一级黄色大片| 久久久久在线观看| 欧美成人午夜激情视频| 亚洲一区二区三区中文字幕在线| 久久九九国产精品| 一卡二卡3卡四卡高清精品视频| 亚洲国产精品热久久| 欧美一区二区在线| 日韩亚洲不卡在线| 一区二区在线看| 国产精品久久久久久久久久久久久久| 久久不见久久见免费视频1| av成人动漫| 最新亚洲一区| 久久躁日日躁aaaaxxxx| 午夜精品区一区二区三| 亚洲精品美女免费| 影院欧美亚洲| 国产一区二区三区不卡在线观看| 欧美日韩国产一区精品一区| 欧美a一区二区|