【原創】視窗訊息處理問題

來源:互聯網
上載者:User
      今天修改了一下之前做的一個Dll注入exe的Demo。之前由於項目需求,所以瞭解了一下遠程注入Dll方面的知識,其實這個Demo也沒有使用到遠程注入的方面,只是寫了一個Dll,在我的Dll中實現對將要注入進程裡的一個視窗進行子類化,寫好之後通過工具把我的dll注入到將要注入的應用程式中。

      在我的dll中有一個讀取註冊表索引值的函數: BOOL ReadData(),通過函數把索引值儲存在一個全域變數dValue。在子類化的過程中,我首先攔截原進程的訊息,相應自己的訊息處理函數,子類化幾乎都是這樣做的。但是我攔截原進程的WM_LBUTTONDOWN或WM_LBUTTONUP訊息中的時候調用我的ReadData函數並把讀到的值存在dValue,但是發現dValue並不一定每次都能擷取到讀取的值,假如註冊表中的那個索引值就是1,dValue擷取到的有時是0有時是1,只是特別讓人費解的地方,迫於無奈我只能把ReadData函數這樣放,如下: 1 LRESULT CALLBACK MyProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
 2 {
 3     ReadData();          //只能在這裡讀才能保證穩定能dValue能擷取到索引值並儲存
 4     switch(msg)
 5       {
 6          case WM_LBUTTONDOWM:
 7          break;
 8 
 9          case WM_LBUTTONUP:
10          break;
11          
12          case default:
13          CallWindowProc(OldWndProc,hwnd,msg, wParam, lParam);
14       }
15     return TRUE;
16 }      不大清楚為什麼會這樣子,我嘗試過在WM_LBUTTONUP中調用ReadData之前先調用一個MessageBox,彈出的對話方塊要等單擊確定之後才去執行ReadData函數,這樣的話也能保證讀取到的索引值儲存在dValue中,我想是否因為視窗受到WM_LBUTTONUP會很快收到其他注入WM_MOUSEMOVE之類的訊息,所以ReadData還沒有處理完線程就跳到了WM_MOUSEMOVE訊息處理中,但是為什麼把ReadData放在訊息處理函數之外就能有充足的時間去執行完這個函數?有待研究。      在這次的修改BUG中,有點體會。寫程式一定要冷靜的分析問題,時刻保持思緒清晰。碰到問題了,首先要從大的方面去檢測問題的所在,然後一步一步的把範圍收縮,最終確定問題的根源所在。程式出問題了,一般把程式減縮成只有一個大概的架構進行測試,沒問題了再向原來的這個架構搭建其他程式再測試,如此不斷搭建不斷測試,最終就容易找到問題的根源。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.