2014-09-02 20 views
3

죄송합니다. 이해할 수 있도록 코드 조각을 넣어야합니다.C# EasyHook, 창 제목 변경

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Threading; 
using System.Runtime.InteropServices; 
using System.Text.RegularExpressions; 
using System.Drawing; 
using EasyHook; 
using System.Windows.Forms; 

namespace LunaInject 
{ 
    public class Main : EasyHook.IEntryPoint 
    { 

     // Dictionary that matches a hdc handle for a poker table window to the value of its big blind 
     static Dictionary<IntPtr, double> hdcList = new Dictionary<IntPtr, double>(); 
     IPokerBBMod.Program.IPokerModInterface Interface; 
     LocalHook DrawTextExHook; 

     Stack<String> Queue = new Stack<String>(); 

     // Regexes to match various poker client strings 
     public static Regex money = new Regex(@"[\$\£\€]?(\d{1,4},)*\d+.?(\d{1,3}|)"); // Matches 
     public static Regex limit = new Regex(@"(?:\d,\d{3}|\d{2,4})\b(?! \d)\/(?:\d,\d{3}|\d{2,4}(?!/))\b(?! \d)"); // Matches a limit eg: $2/$4 
     public static Regex bigBlind = new Regex(@"\/(?:\d,\d{3}|\d{2,4}(?!/))\b(?! \d)"); // Matches the big blind in a limit. 


     // DrawTextExW is the Win32 function that draw text to the graphical are of client and the function we need to intercept 
     [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.StdCall)] 
     static extern int DrawTextExW(IntPtr hdc, [In, Out, MarshalAs(UnmanagedType.LPTStr)] string lpString, int cchText, [In, Out, MarshalAs(UnmanagedType.Struct)] ref RECT lprc, uint dwDTFormat, [In, Out, MarshalAs(UnmanagedType.Struct)] ref DRAWTEXTPARAMS dparams); 

     // Function to force a window to redraw 
     [DllImport("user32.dll")] 
     static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase); 

     [DllImport("gdi32.dll")] 
     static extern uint SetTextColor(IntPtr hdc, int crColor); 


     // Delegate that holds the definition of our callback function that will be called whenever we intercept the DrawTextExW function. 
     [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] 
     delegate int DDrawTextEx(IntPtr hdc, [In, Out, MarshalAs(UnmanagedType.LPTStr)] string lpString, int cchText, [In, Out, MarshalAs(UnmanagedType.Struct)] ref RECT lprc, uint dwDTFormat, [In, Out, MarshalAs(UnmanagedType.Struct)] ref DRAWTEXTPARAMS dparams); 

     // Win32 Struct 
     [Serializable, StructLayout(LayoutKind.Sequential)] 
     public struct DRAWTEXTPARAMS 
     { 
      public uint cbSize; 
      public int iTabLength; 
      public int iLeftMargin; 
      public int iRightMargin; 
      public uint uiLengthDrawn; 
     } 

     // Win32 Struct 
     [Serializable, StructLayout(LayoutKind.Sequential)] 
     public struct RECT 
     { 
      public int Left; 
      public int Top; 
      public int Right; 
      public int Bottom; 

      public RECT(int left_, int top_, int right_, int bottom_) 
      { 
       Left = left_; 
       Top = top_; 
       Right = right_; 
       Bottom = bottom_; 
      } 

      public int Height { get { return Bottom - Top; } } 
      public int Width { get { return Right - Left; } } 
     } 


     public Main(RemoteHooking.IContext InContext, String InChannelName) 
     { 
      // connect to host... 
      Interface = RemoteHooking.IpcConnectClient<IPokerBBMod.Program.IPokerModInterface>(InChannelName); 
     } 

     public void Run(RemoteHooking.IContext InContext, String InChannelName) 
     { 
      // Install system hook to detect calls to DrawTextExW that is made by the client and call the function DrawText_Hooked when ever this happens 
      try 
      { 
       DrawTextExHook = LocalHook.Create(LocalHook.GetProcAddress("user32.dll", "DrawTextExW"), new DDrawTextEx(DrawText_Hooked), this); 
       DrawTextExHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 }); 
      } 

      catch (Exception ExtInfo) 
      { 
       Interface.ReportException(ExtInfo); 
       return; 
      } 

      //// force entire desktop to redraw to update IPoker graphics immediately 
      InvalidateRect((IntPtr)null, (IntPtr)null, true); 

      RemoteHooking.WakeUpProcess(); 

      // wait for host process termination... 
      try 
      { 
       while (true) 
       { 
        Thread.Sleep(500); 

        // transmit newly monitored file accesses... 
        if (Queue.Count > 0) 
        { 
         String[] Package = null; 

         lock (Queue) 
         { 
          Package = Queue.ToArray(); 

          Queue.Clear(); 
         } 

        } 
        else 
         Interface.Ping(); 
       } 
      } 
      catch 
      { 
      } 

      //// force entire desktop to redraw to update IPoker graphics immediately 
      InvalidateRect((IntPtr)null, (IntPtr)null, true); 

     } 

     // Intercept function that is called whenever the ipoker client draws text to its graphical area. 
     // IPoker draws text in a convuluted way, and it is extremely difficult to tell which window a piece of text is being drawn on hence the messy workaround 
     static int DrawText_Hooked(IntPtr hdc, [In, Out, MarshalAs(UnmanagedType.LPTStr)] string lpString, int cchText, [In, Out, MarshalAs(UnmanagedType.Struct)] ref RECT lprc, uint dwDTFormat, [In, Out, MarshalAs(UnmanagedType.Struct)] ref DRAWTEXTPARAMS dparams) 
     { 
      double bigBlindAmount; 
      double m; 

      // If detect a call to DrawTextEx with a new hdc and dwDTFormat 0x0800, check to see if the text being draw matches a limit regex (ie: it is a table title) 
      // If so find the value of the big blind and add it to our dictionary of hdc/big blind pair values. 

      if (dwDTFormat == 0x0800 && !hdcList.ContainsKey(hdc)) 
      { 
       Match tableTitle = limit.Match(lpString); 
       if (tableTitle.Success) 
       { 
        double.TryParse(bigBlind.Match(tableTitle.Value).Value.Substring(1), out bigBlindAmount); 

        hdcList.Add(hdc, Convert.ToDouble(bigBlindAmount)); 
        InvalidateRect((IntPtr)null, (IntPtr)null, true); 
       } 
      } 

      // Match the string being drawn to a money regex, if it matches the client is trying to write text that is money values 
      else if (money.IsMatch(lpString) && Double.TryParse(lpString.Substring(0), out m)) 
      { 
       // Get the big blind value for the money value and convert to big blinds 
       if (dwDTFormat == 0x0800 && hdcList.ContainsKey(hdc)) 
       { 

        bigBlindAmount = hdcList[hdc]; 

        m = m/bigBlindAmount; 

        string stringOut = m.ToString("N"); 

        return DrawTextExW(hdc, stringOut, -1, ref lprc, dwDTFormat, ref dparams); 

       } 

       else 
       { 

        return DrawTextExW(hdc, lpString, cchText, ref lprc, dwDTFormat, ref dparams); 
       } 
      } 

      return DrawTextExW(hdc, lpString, cchText, ref lprc, dwDTFormat, ref dparams); 
     } 
    } 
} 

"Something 100/200"에서 "Something 150/300"으로 창 제목이 변경 될 때까지 모든 것이 잘 작동합니다. 나는 새로운 가치를 얻어야합니다.

이 내가 업데이트해야 할 코드의 평화 :

 bigBlindAmount = hdcList[hdc]; 

     m = m/bigBlindAmount; 

     string stringOut = m.ToString("N"); 

     return DrawTextExW(hdc, stringOut, -1, ref lprc, dwDTFormat, ref dparams); 

bigBlindAmount은이 apllication 제목에서 300분의 150 그. 응용 프로그램 제목이 100/200에서 15/300으로 변경되면 bigBlindAmount를 150/300으로 변경해야합니다.

답변을 제공해 주시면 대단히 감사하겠습니다.

답변

0

는 당신이 필요에 따라 주입 DLL 내부

Process.GetCurrentProcess().MainWindowTitle 

에서 창 제목을 얻고, 당신이 필요로하는 값까지 분석 할 수 있다고 생각합니다.