Przejdź do głównej zawartości

FAQ dotyczące UI i .Net

Jeśli istniejące dialogi Syrve POS nie są wystarczające, wtyczka może wyświetlać dialogi zdefiniowane przez użytkownika, jednak należy wziąć pod uwagę pewne specyficzne kwestie.

Po pierwsze, domyślny proces hosta wtyczki nie zawiera wątku STA wymaganego dla UI. Wtyczka musi go jednak utworzyć. Przykładowy kod:

ctor()
{
var windowThread = new Thread(EntryPoint);
windowThread.SetApartmentState(ApartmentState.STA);
windowThread.Start();
}
...
private void EntryPoint()
{
Window window = new MyWindow();
window.ShowDialog();
}

Po drugie, domyślnie dialog procesu w tle nie ma fokusu, dlatego zdarzenia wejściowe dotyczą wcześniej aktywnego dialogu, czyli dialogu Syrve POS. Według Microsoft, aplikacja nie może sama przejść na pierwszy plan, może to zrobić tylko wcześniej aktywny dialog lub użytkownik, który może wywołać aplikację na pierwszy plan. Jednak to drugie można zaprogramować z góry:

public static void ClickWindow(Window wnd)
{
try
{
var wih = new WindowInteropHelper(wnd);
WinApi.RECT rect;
WinApi.GetWindowRect(new HandleRef(wnd, wih.Handle), out rect);
var x = rect.Left + (rect.Right - rect.Left) / 2;
var y = rect.Top + (rect.Bottom - rect.Top) / 4;
WinApi.LeftMouseClick(x, y);
}
catch (Exception) { }
}

Po trzecie, dialog wtyczki, będący niezależnym oknem, może zostać umieszczony za oknem Syrve POS. Tryb Always On Top nie rozwiązuje tego problemu, ponieważ mogą istnieć inne okna z najwyższym priorytetem, w tym sama aplikacja Syrve POS. Wtyczka może powiązać swój dialog z oknem Syrve POS jako dialog potomny za pomocą funkcji WinAPI SetParent. Chociaż hwnd okna Syrve POS nie jest udostępnione w API, wtyczka może je znaleźć samodzielnie.