Windows에서 자주 쓰이는 프로그램 하나

아마도 이 게시물의 성격 상 해킹 존으로 이동하는 것이 바람직할 것이라 생각되어 올립니다.


Win32의 API 중에 GetWindowText라는 API를 캡슐링한 콘솔 프로그램 하나를 급조했습니다. 필요에 의해서 작성한 것이지만 무척 요긴하게 쓰는 중입니다. Visual Studio의 개발 보조 도구 중 Spy++ 라는 유틸리티와 같이 사용하시면 편리합니다.


Spy++를 통하여 찾은 16진수 형태의 윈도우 핸들 값을 다음과 같이 명령줄로 실행하면 표준 출력 스트림으로 GetWindowText API의 결과물이 나옵니다.


whook [16진수 윈도우 핸들값]

이것을 리디렉션을 사용하여 파일로 쓰시면 텍스트 박스의 내용을 그대로 가져올 수 있습니다.


whook [16진수 윈도우 핸들값] > log.txt

모노와 크게 상관은 없는 것이지만 Win32용 모노에서도 빌드가 가능하니 많은 활용 바랍니다. ^^; 리플렉션 강좌를 올리기 전에 팁도 하나 올렸으면 하여 이곳에 소스 코드와 프로그램을 같이 올립니다.


using System;
using System.Text;
using System.Globalization;
using System.Runtime.InteropServices;

namespace DevDream.Services.WindowHook
{
   internal sealed class MainObject
   {
       [DllImport(“user32.dll”, SetLastError = true, CharSet = CharSet.Auto)]
       private static extern int GetWindowText(
           IntPtr hWnd,
           [Out] StringBuilder lpString,
           int nMaxCount);

       [MTAThread()]
       private static void Main(string[] arguments)
       {
           try
           {
               IntPtr targetHandle = new IntPtr(Int64.Parse(arguments[0], NumberStyles.AllowHexSpecifier));
               StringBuilder buffer = new StringBuilder();
               GetWindowText(targetHandle, buffer, Int32.MaxValue);
               Console.Out.Write(buffer.ToString());
           }
           catch(IndexOutOfRangeException)
           {
               Console.Error.WriteLine(“Handle value is not specified. whook is now closing.”);
               Environment.Exit(-1);
           }
           catch(ArgumentNullException)
           {
               Console.Error.WriteLine(“Handle value is not specified. whook is now closing.”);
               Environment.Exit(-1);
           }
           catch(ArgumentException)
           {
               Console.Error.WriteLine(“Handle value is not specified. whook is now closing.”);
               Environment.Exit(-1);
           }
           catch(FormatException)
           {
               Console.Error.WriteLine(“Handle value not contains ANSI characters. whook is now closing.”);
               Environment.Exit(-1);
           }
           catch(OverflowException)
           {
               Console.Error.WriteLine(“Handle value is too big. whook is now closing.”);
               Environment.Exit(-1);
           }
           catch
           {
               Console.Error.WriteLine(“Unexpected exception occurred. whook is now closing.”);
               Environment.Exit(-1);
           }
       }
   }
}

댓글 남기기