2013-06-25 2 views
5

하나의 특정 WPF 창에 포커스를 유지하려고합니다. 즉, 표준 Windows 작업 표시 줄과 같이 포커스를 잃을 때 창 스타일을 변경해서는 안됩니다. 이를 위해 WndProc에 연결하여 WM_NCACTIVATE 또는 WM_ACTIVATE이 false (wParam == 0)로 설정되어 있는지 확인한 다음 메시지를 handled = true;으로 표시하여 창을 비활성 상태로 차단합니다. 여기에 몇 가지 예제 코드입니다 :시작 창에서 WM_NCACTIVATE를 처리하면 다른 모든 창을 차단합니다.

void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    var source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); 
    if (source != null) source.AddHook(WndProc); 
} 

private const uint WM_NCACTIVATE = 0x0086; 
private const int WM_ACTIVATE = 0x0006; 
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    if (msg == WM_NCACTIVATE) 
    { 
     if (wParam == new IntPtr(0)) 
      handled = true; 
    } 
    if (msg == WM_ACTIVATE) 
    { 

     if (wParam == new IntPtr(0)) 
      handled = true; 
    } 
    return IntPtr.Zero; 
} 

이 작업을 수행하여, 그러나,이 메인 윈도우 내에서 생성되는 다른 모든 WPF 창

var f = new Window(); 
f.ShowDialog(); 

는 포커스를받을 결코 그들이 볼 수 있지만, 윈도우는 않습니다 클라이언트 영역과 Windows 최소화, 최대화 및 닫기 버튼 모두에 대해 사용자 입력에 반응하지 않습니다. 분명히 잘못된 일을하고 있습니다. 따라서 올바른 방법으로 수행하는 방법에 대한 조언이나 조언이 필요하십니까?

+0

코드는 당신이 그것을하지 무슨 희망하지 않습니다. 단지 WPF가 메시지를 보지 못하게합니다. 창이 여전히 활성화되어 있지만 WPF는이를 인식하지 못합니다. 그래서 절망적으로 혼란스러워집니다. 창 비활성화를 방지하려면 WPF에없는 더 큰 무기가 필요합니다. –

+0

네, 그게 내가 예상 한 것입니다. 그렇다면 이것을 접근하는 더 좋은 방법은 무엇일까요? – dsfgsho

+0

접근 * * *? 작업 표시 줄에는 "스타일"이 없으므로 해결하려는 문제가 무엇인지 명확하지 않습니다. WPF는 작업 표시 줄 만들기를 직접 지원하지 않으므로 SHAppBarMessage()를 pinvoking하여 만듭니다. 그것은 잘 googles. –

답변

4

윈도우가 포커스를 잃을 경우에도 활성에 WPF 윈도우의 비주얼 스타일을 유지하는이 솔루션은이 같은 WM_NCACTIVATE을 처리하는 것입니다

private const uint WM_NCACTIVATE = 0x0086; 

private IntPtr WndProc(IntPtr hwnd, int msg, 
     IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    var returnvalue = IntPtr.Zero; 
    if (msg == WM_NCACTIVATE) 
    { 
     //replace the wParam (true/false) which indicates 
      //active/inactive with always true 
     returnvalue = DefWindowProc(hwnd, WM_NCACTIVATE, 
        new IntPtr(1), new IntPtr(-1)); 
     handled = true; 
    } 
} 


[DllImport("user32.dll")] 
static extern IntPtr DefWindowProc(IntPtr hWnd, WindowsMessages uMsg, IntPtr wParam, IntPtr lParam); 
관련 문제