2016-09-05 7 views
-3

Easy Hook lib를 사용하고 있습니다. 소유자 윈도우가 어떻게 처리됩니까?DrawText Hook에서 자식의 부모 Hwd 가져 오기

[StructLayout(LayoutKind.Sequential)] 
    public struct Rect 
    { 
     public int Left; 
     public int Top; 
     public int Right; 
     public int Bottom; 

     public override string ToString() 
     { 
      return $"[Left: {Left}, Top: {Top}, Right: {Right}, Bottom: {Bottom}]"; 
     } 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Unicode)] 
    public static extern int DrawText(IntPtr hDc, string lpString, int nCount, ref Rect lpRect, uint uFormat); 

    [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] 
    public delegate int DDrawText(IntPtr hDc, string lpString, int nCount, ref Rect lpRect, uint uFormat); 



    private int DrawText_Hooked(IntPtr hDc, string lpString, int nCount, ref Rect lpRect, uint uFormat) 
    { 
     var This = (Main) HookRuntimeInfo.Callback; 
     lock (This._queue) 
     { 
      var parent = GetAncestor(hDc, GetAncestorFlags.GetParent); // always return 0! why????????????????         
      This._queue.Push($"parent [{parent}]"); 
     } 
     return DrawText(hDc, lpString, nCount, ref lpRect, uFormat); 
    } 

GetWindowDC,의 GetDC,의 getParent 및 기타 방법 부모 창을 가져도 전혀 작동하지 않습니다?

+1

GetAncestor는 창 핸들을 필요로하며 드로잉 컨텍스트를 전달합니다. 드로잉 컨텍스트에서 창 핸들을 가져 오려면 [GetWindowFromDC] (https://msdn.microsoft.com/en-us/library/dd145201(VS.85) .aspx)를 호출하십시오. –

+0

무엇을하려고합니까? – andlabs

+0

WindowFromDC는 작동하지 않습니다! –

답변

0
var parent = GetAncestor(hDc, GetAncestorFlags.GetParent); // always return 0! why???????????????? 

이 코드는 완전히 잘못된 것입니다. 컴파일 할 수있는 유일한 이유는 HWNDHDC이 관리 환경에서 포인터 (IntPtr)로 입력 되었기 때문입니다. C 또는 C++로 작성한 경우 컴파일 오류가 발생하여 문제를 쉽게 볼 수 있습니다.

연결 한 DrawText 함수는 첫 번째 매개 변수로 텍스트가 그려지는 장치 컨텍스트 (HDC)에 대한 핸들을 갖습니다.

호출중인 GetAncestor 함수의 첫 번째 매개 변수는 창 핸들 (HWND)입니다. HDCHWND은 호환되지 않는 유형입니다. 그들은 상호 교환 될 수 없다.

장치 컨텍스트 (HDC)에는 "조상"이 없으며 수행 한 경우에도 GetAncestor 함수는 창 전용으로 설계되었습니다. 디바이스 컨텍스트를 어떻게 처리해야할지 모르기 때문에 실패합니다. 잘못된 창 핸들을 전달했습니다.

DC에 해당하는 "부모 창"을 얻는 방법에 관한 실제 질문까지는이 질문이 의미가 없습니다. 장치 컨텍스트에는 "부모"창이 없으며 일부 장치 컨텍스트는 창과 연관되어 있습니다. 장치 컨텍스트가 창과 연결되어있는 경우 WindowFromDC function을 호출하고 HDC을 전달하여 연결된 HWND을 검색 할 수 있습니다. 다시 말하지만, 이것이 실제 문제를 해결하지는 않을 것이라는 점을 강조해야합니다. 장치 컨텍스트가 창과 연관되어 있다고 보장 할 수 없습니다. 장치 컨텍스트가 화면과 연관되거나 메모리 DC 일 수도 있고 장치 DC (물리적 모니터, 프린터 또는 기타 출력 장치와 연결됨) 일 수도 있습니다. 이 경우 모두 WindowFromDCNULL (null 포인터 또는 값 IntPtr.Zero)을 반환합니다.

논리적으로 생각하면, 무엇을 묻고 있는지 구분할 수 있습니다. 응용 프로그램에서 메모리 DC를 만들고 텍스트를 그릴 때 DrawText을 호출하는 간단한 경우를 생각해보십시오. 어떤 "창"을 검색 하시겠습니까? 프로세스의 "기본"창일까요? 먼저, 임의의 프로세스에 대해이를 판별 할 수있는 방법이 없습니다. 둘째, 과정도 모든 창을 가지고 있지 않을 수도 있습니다! 메모리 DC에 텍스트를 만들고 그리는 창없는 프로세스를 만들 수 있습니다. 그렇게한다면, 당신의 갈고리를 부수는 것이 낫지 않을 것입니다!

이 코드의 목적에 대한 설명을 위해 몇 가지 탄원을 거부했습니다. 왜 처음에 DrawText에 걸리는지 확실하지 않습니다. 후크 절차는 아무 것도하지 않습니다. 또한 응용 프로그램이 DrawTextEx, ExtTextOut 또는 TextOut을 호출하여 텍스트를 그리는 경우를 놓친 경우에는 텍스트를 그릴 때 GDI를 사용한다고 가정합니다. GDI +, DirectDraw 또는 다른 드로잉 API를 사용하면 후크가 호출되지 않습니다. DrawText에 전화를 거는 유일한 이유는 해당 동작을 변경하려는 경우입니다.훅 프로 시저에서 실제로 동작을 변경하는 것이 아니며 창을 기반으로 동작을 변경할 수도 없습니다. 장치 컨텍스트만을 다루는 그리기 기능입니다.

+0

대답 해 주셔서 감사합니다! –

+0

나는 질문이있다. 우리는 많은 Windows 응용 프로그램을 가지고 있습니다. 각 창에는 자체 구성이 있습니다. 창에 따라 컨트롤의 텍스트를 변경해야합니다. 이 컨트롤에 액세스하는 방법은 무엇입니까? spy ++는 C#을 사용하여 (윈도우가 없음) 보이지 않습니다. –

+0

응용 프로그램의 소스 코드를 찾아 보거나 [System.Windows.Automation] (https://msdn.microsoft.com/en)을 방문해야합니다. -us/library/ms747327 (v = vs.110) .aspx) 컨트롤을 보거나 텍스트를 변경할 수 있습니다. 또는 문자열이 strings 테이블 리소스에서 제공된 경우 리소스 편집기를 사용합니다. 행운을 빕니다. – andlabs