2016-06-29 4 views
0

바탕 화면에 항상있는 것과 같은 작은 창을 갖고 싶습니다. 바탕 화면 가젯이 Windows에서 단종되었으므로 (바탕 화면에 항상있는 두 개의 버튼이 있습니다) 다른 하드 코드 대안은 그렇게 할 수 있습니까?Windows에서 바탕 화면 가젯 대안

답변

2

네, 가능하지만 약간의 작업이 필요합니다. 프로세스 개요 :

  1. 양식의 ShowInTaskbar 속성을 false로 설정하면 작업 표시 줄에 나타나지 않습니다.
  2. 양식의 BorderStyle 속성을 없음으로 설정하십시오. 캡션 표시 줄, 최소화/최대화 단추 등을 편리하게 제거 할 수도 있습니다.
  3. 양식의 창 프로 시저를 무시하고 WM_WINDOWPOSCHANGING 메시지를 처리하므로 Z 축의 맨 아래에 창을 유지할 수 있습니다. 주문.
  4. 양식을 배경으로 끌어서 이동할 수 있도록 양식의 WM_NCHITTEST 메시지를 처리하십시오. HTCAPTION을 반환하면 마우스와 같은 시스템 동작이 양식의 캡션 표시 줄에 나타납니다.

간단한 데모로, false로 설정 ShowInTaskbar 속성, 양식을 작성하고, 없음 BorderStyle 세트. 그런 다음 다음 코드를 추가하십시오.

static readonly IntPtr HWND_BOTTOM = new IntPtr(1); 
private const int WM_NCHITTEST = 0x0084; 
private const int WM_WINDOWPOSCHANGING = 0x0046; 
private const int HTCAPTION = 2; 
private const int HTCLIENT = 1; 

private struct WINDOWPOS 
{ 
    public IntPtr hwnd; 
    public IntPtr hwndInsertAfter; 
    public int x; 
    public int y; 
    public int cx; 
    public int cy; 
    public uint flags; 
} 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_NCHITTEST) 
    { 
     m.Result = new IntPtr(HTCAPTION); 
     return; 
    } 
    else if (m.Msg == WM_WINDOWPOSCHANGING) 
    { 
     WINDOWPOS posInfo = Marshal.PtrToStructure<WINDOWPOS>(m.LParam); 
     posInfo.hwndInsertAfter = HWND_BOTTOM; 
     Marshal.StructureToPtr(posInfo, m.LParam, true); 
    } 
    base.WndProc(ref m); 
}