2017-03-16 2 views
0

현재 윈도우 핸들이 IntPtr이고 Window을 사용하려고 시도했지만 HwndSource.FromHwnd을 사용했지만 null을 반환합니다. Window 요소를 검색 한 경우 해당 MaxWidth 특성을 설정할 수 있습니다.윈도우 핸들에서 다른 애플리케이션의 최대 너비를 설정할 수 있습니까?

외부 응용 프로그램의 창 핸들을 가지지 않고 최대 너비를 설정할 수있는 다른 방법이 있습니까?

편집 : RbMm 님의 접근 방식이 작동하는지 확인하려고합니다. 질문의 태그 C#을하지만, 이것은 C++ 사용자 지정 DLL을 사용해볼 가치가 될 수는 :

bool InitializeMaxWidthHook(int threadID, HWND destination) 
{ 
    if (g_appInstance == NULL) 
    { 
     return false; 
    } 

    SetProp(GetDesktopWindow(), "WILSON_HOOK_HCBT_MINMAX", destination); 

    hookMaxWidth = SetWindowsHookEx(WH_CBT, (HOOKPROC)MinMaxHookCallback, g_appInstance, threadID); 
    return hookMaxWidth != NULL; 
} 

void UninitializeMaxWidthHook() 
{ 
    if (hookMaxWidth != NULL) 
     UnhookWindowsHookEx(hookMaxWidth); 
    hookMaxWidth = NULL; 
} 

static LRESULT CALLBACK MinMaxHookCallback(int code, WPARAM wparam, LPARAM lparam) 
{ 
    if (code >= 0) 
    { 
     UINT msg = 0; 

     if (code == HCBT_MINMAX) 
      msg = RegisterWindowMessage("WILSON_HOOK_HCBT_MINMAX"); 

     HWND dstWnd = (HWND)GetProp(GetDesktopWindow(), "WILSON_HOOK_HCBT_MINMAX"); 

     if (msg != 0) 
      SendNotifyMessage(dstWnd, msg, wparam, lparam); 
    } 

    return CallNextHookEx(hookMaxWidth, code, wparam, lparam); 
} 

나는 다시 땜질 후 질문을 업데이트 할 수 있습니다.

+1

창에는 'MaxWidth' 속성이 없습니다. 윈도우 프로 시저 핸들 ['WM_GETMINMAXINFO'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632626 (v = vs.85) .aspx) 메시지와''MINMAXINFO에서''ptMaxSize'를 반환합니다 '] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632605 (v = vs.85) .aspx) - 제어 창 프로 시저 – RbMm

+0

가능한 유일한 방법은 이렇게 설정하십시오. WH_CALLWNDPROCRET'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644976 (v = vs.85) .aspx) - CallWndRetProc 콜백 함수를 구현하고 MINMAXINFO 구조를 변경하십시오. – RbMm

+0

또 다른 방법은 윈도우 크기를 모니터 (폴링)하고 크기가 너무 커지면 [크기를 조절하십시오] (http://stackoverflow.com/q/8443502/1997232). – Sinatr

답변

0

내가 생각해 낸 해결책은 순수하게 C#이 아니기 때문에 질문 태그에 완벽하게 맞지 않지만 어쨌든 게시합니다.

내가 GETMINMAXINFO을 듣고 WndProc 훅 초기화 기능을 가진 타사 DLL을 생성 (I 개인 정보 보호에 대한 코드의 일부를 제거하지만이 GETMINMAXINFO의 하나입니다 : 다음 초기화

#include "stdafx.h" 
#include <windows.h> 

HINSTANCE g_appInstance = NULL; 
typedef void (CALLBACK *HookProc)(int code, WPARAM w, LPARAM l); 

HHOOK hookWndProc = NULL; 
static LRESULT CALLBACK WndProcHookCallback(int code, WPARAM wparam, LPARAM lparam); 

bool InitializeWndProcHook(int threadID, HWND destination) 
{ 
    if (g_appInstance == NULL) 
    { 
     return false; 
    } 

    SetProp(GetDesktopWindow(), "WILSON_HOOK_HWND_WND_PROC", destination); 

    hookWndProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProcHookCallback, g_appInstance, threadID); 
    return hookWndProc != NULL; 
} 

void UninitializeWndProcHook() 
{ 
    if (hookWndProc != NULL) 
     UnhookWindowsHookEx(hookWndProc); 
    hookWndProc = NULL; 
} 

static LRESULT CALLBACK WndProcHookCallback(int code, WPARAM wparam, LPARAM lparam) 
{ 
    if (code >= 0) 
    { 
     UINT msg = 0; 

     WPARAM newWPARAM; 
     LPARAM newLPARAM; 
     if (code == HC_ACTION) 
     { 
      CWPSTRUCT *wndProc = (CWPSTRUCT *)lparam;   
      if (shouldSendMessageOnWindow(wndProc->hwnd)) 
      { 
       // if the message is from other process, the value of wparam is null 
       UINT wndProcMessage = wndProc->message; 
       if (wndProcMessage == WM_GETMINMAXINFO) 
       { 
        newWPARAM = (WPARAM)wndProc->hwnd; 
        newLPARAM = (LPARAM)wndProc->lParam; 
        msg = RegisterWindowMessage("WILSON_HOOK_HC_ACTION_WND_PROC_WM_GETMINMAXINFO"); 
       } 
      } 
     } 

     if (msg != 0) 
     { 
      HWND dstWnd = (HWND)GetProp(GetDesktopWindow(), "WILSON_HOOK_HWND_WND_PROC"); 
      SendNotifyMessage(dstWnd, msg, newWPARAM, newLPARAM); 
     } 
    } 

    return CallNextHookEx(hookWndProc, code, wparam, lparam); 
} 

MINMAX 메시지가 다음 내가 원하는 크기에 정보를 설정이 내 C# 코드에 후크와는 기다렸다.

private struct POINT 
{ 
    public int x; 
    public int y; 
} 

private struct MINMAXINFO 
{ 
    public POINT ptReserved; 
    public POINT ptMaxSize; 
    public POINT ptMaxPosition; 
    public POINT ptMinTrackSize; 
    public POINT ptMaxTrackSize; 
} 

/**Other Code**/ 

MINMAXINFO* minMaxInfo = (MINMAXINFO*) lParam; 

int currentMaxSize = minMaxInfo->ptMaxSize.x; 
Debug.WriteLine("Updated max" + currentMaxSize); 

minMaxInfo->ptMaxSize.x = screenWidth; 
minMaxInfo->ptMaxSize.y = screenHeight; 

User32.SetWindowPos(wParam, User32.SpecialWindowHandles.HWND_TOP, 0, 0, screenWidth, screenHeight, User32.SetWindowPosFlags.SWP_DRAWFRAME | User32.SetWindowPosFlags.SWP_ASYNCWINDOWPOS); 

/**Other Code**/ 

이 일부 응용 프로그램, 근무 ns (Win32 응용 프로그램에만 해당). Metro Apps 및 Java 애플릿과 같은 일부 응용 프로그램에는 액세스 할 수 없습니다.

하지만 지금은 처음에 유용 할 것입니다.

덕분에이 대답을 안내하는 Hans PassantRbMm에게 감사드립니다.

관련 문제