2010-04-30 134 views
0

我正在c#中注入dll軟件,注入的dll也在c#中,並且我正在使用某些系統函數的pinvoke。掛鉤extTextOut問題

當使用extTextOut我得到的字符串炒和行混合在一起 我做錯了什麼?

try 
      {     
       CreateFileHook = LocalHook.Create(
        LocalHook.GetProcAddress("gdi32.dll", "ExtTextOutW"), 
        new DExtTextOutW(ExtTextOutW_Hooked), 
        this); 

       CreateFileHook.ThreadACL.SetExclusiveACL(new Int32[1]); 

      } 

和我extTextOut方法是

[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.StdCall)] 
     static extern bool ExtTextOutW(IntPtr hdc, 
             int X, 
             int Y, 
             uint fuOptions, 
             [In] ref RECT lprc, 
             string lpString, 
             uint cbCount, 
             [In] IntPtr lpDx); 

static bool ExtTextOutW_Hooked(
      IntPtr hdc, 
      int X, 
      int Y, 
      uint fuOptions, 
      [In] ref RECT lprc, 
      string lpString, 
      uint cbCount, 
      [In] IntPtr lpDx) 
     { 


      try 
      { 
       DemoInjection This = (DemoInjection)HookRuntimeInfo.Callback; 

       lock (This.Queue) 
       {      
        This.Queue.Push(lpString); 

       } 
      } 
      catch 
      { 
      }   

      return ExtTextOutW(
       hdc, 
       X, 
       Y, 
       fuOptions, 
       ref lprc, 
       lpString, 
       cbCount, 
       lpDx 
       ); 

     } 

如果另外一個問題我可能:

我extTextOut使用EasyHook從codeplex.com這樣的大呼過癮。我怎樣才能經常監控一個沒有聚焦或最小化的窗口(使用這種方法它不能正常工作)

非常感謝!

回答

1

如果我理解正確的意思「字符串加密,而且線獲得混合」不是有兩個問題可以幫助你:

  1. 字符串可以輸出字形指數,而不是作爲一個字符(因此將顯示爲亂碼文本)。

  2. 你應該只引用由cbCount提供的字符的數量參數字符串中的其他字符可能是「垃圾」字符。

希望有所幫助。

+0

現在我正在經歷同樣的問題。即使當我只是將參數傳遞給ExtTextOutW函數時,我仍然在掛鉤程序中遇到問題 - 它顯示了一些象形文字而不是拉丁文本。我相信,問題在於MarshalAs在轉換爲CLR字符串時會更改源數據中的某些內容。只有在設置了字形標誌時,問題纔會顯示,否則,鉤子可以正常工作,並且掛鉤文本不會損壞。 – 2013-01-14 12:55:52