2009-02-09 4 views
5

'always-on-bottom-windows'를 만드는 방법이나 창을 바탕 화면에 고정하는 방법을 아는 사람이 있습니까? 초점과 마우스 클릭을 받아야하지만 Z 순서의 맨 아래에 있어야합니다. 사용자가 모두 최소화하거나 데스크톱 작업을 표시 할 때도 데스크톱에 머무를 수 있다면 좋을 것입니다.'always-on-bottom-window'만드는 법

델파이 및 C# 솔루션 (또는 부분 솔루션/힌트) 모두 훌륭합니다.

+0

숨겨진 응용 프로그램 창을 메인 창 사이의 상호 작용이 물건을 더 복잡하게 만들 것입니다 때문에, 뭔가하지만 델파이를 사용해야 가능합니다. 대부분이 forms.pas의 사적인 내용으로 변경하기가 어렵습니다. – mghie

+0

바탕 화면 표시를 사용할 때 불가능합니다. 그러나 Minimize All을 사용할 때 - MinimizeBox 속성을 false로 설정하면 폼 최소화를 비활성화 할 수 있습니다. – configurator

+0

중복 : http://stackoverflow.com/questions/365094/window-on-desktop –

답변

12

경고 SetParent를 호출하고 창을 바탕 화면의 자식으로 설정하면이 작업을 수행 할 수 있습니다. 이렇게하면, 당신은 당신의 자식 창에 바탕 화면의 입력 큐를 결합하기는 Win32 창 관리자의 원인이이 나쁜 일입니다 - 또한 Raymond Chen explains why.

, HWND_BOTTOM로를 SetWindowPos를 호출하면 불완전 있음을 유의하십시오. 창이 zorder를 바꿀 때마다이 작업을 수행해야합니다. WM_WINDOWPOSCHANGING 이벤트를 처리하고, 자세한 정보는 SWP_NOZORDER를보십시오.

7

SetWindowPos는 AlwaysOnTop 창을 만들 수 있습니다. 대부분 반대 결과를 줄 수 있습니다. 이 라인을 따라 뭔가를보십시오 :

[DllImport("user32.dll")] 
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, 
    int Y, int cx, int cy, uint uFlags); 


public const uint SWP_NOSIZE   = 0x0001; 
public const uint SWP_NOMOVE   = 0x0002; 
public const uint SWP_NOACTIVATE  = 0x0010; 
public const int HWND_BOTTOM = 1; 


SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); 

참고 :

  • 가장 가능성이 후,이 일이 발생하면
  • (항상 하단에 창을 만들기위한) 쇼 바탕 화면을이 방법을 테스트하지 않았습니다

      작업 창을 숨길 것입니다. 어쩌면이 '좋은'API를 더 깊이 파고 들어야 할 것입니다.

    편집 : - a duplicate이 트릭을하고 뭔가 흥미로운 것을 발견 여부를 확인하기 위해이 라인을 따라 몇 가지 검색을 완료.

  • +1

    다른 SO 질문에 대한 링크 +1, 그것은 OP를 시작하는 모든 것을 포함해야합니다. – mghie

    1

    다음은 ATL 창을위한 솔루션입니다. C#을 신청할 수 있다면 도움이 될 것입니다.


    BEGIN_MSG_MAP(...) 
        ... 
        MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnWindowPosChanging) 
        ... 
    END_MSG_MAP() 
    
    LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
    
    { 
    
        if (_bStayOnBottom) 
        { 
         auto pwpos = (WINDOWPOS*)lParam; 
    
         pwpos->hwndInsertAfter = HWND_BOTTOM; 
    
         pwpos->flags &= (~SWP_NOZORDER); 
    
        } 
        return 0; 
    } 
    
    +0

    위대한 작품! 고맙습니다! – Andy