하나의 특정 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 최소화, 최대화 및 닫기 버튼 모두에 대해 사용자 입력에 반응하지 않습니다. 분명히 잘못된 일을하고 있습니다. 따라서 올바른 방법으로 수행하는 방법에 대한 조언이나 조언이 필요하십니까?
코드는 당신이 그것을하지 무슨 희망하지 않습니다. 단지 WPF가 메시지를 보지 못하게합니다. 창이 여전히 활성화되어 있지만 WPF는이를 인식하지 못합니다. 그래서 절망적으로 혼란스러워집니다. 창 비활성화를 방지하려면 WPF에없는 더 큰 무기가 필요합니다. –
네, 그게 내가 예상 한 것입니다. 그렇다면 이것을 접근하는 더 좋은 방법은 무엇일까요? – dsfgsho
접근 * * *? 작업 표시 줄에는 "스타일"이 없으므로 해결하려는 문제가 무엇인지 명확하지 않습니다. WPF는 작업 표시 줄 만들기를 직접 지원하지 않으므로 SHAppBarMessage()를 pinvoking하여 만듭니다. 그것은 잘 googles. –