ich ein kleines Problem vollständig Verständnis AttachThreadInput bekam.Verständnis AttachThreadInput - Abnehmen verlieren Fokus
Ich weiß, es ist "verbinden" die Nachrichtenwarteschlange von 2 Threads, die (zum Beispiel, was ich tun möchte) ermöglicht es mir, mein Fenster (winforms) im Vordergrund zu erzwingen.
Was ich mit dieser Methode kann:
private void SetForegroundWindowEx(IntPtr hWnd)
{
uint SW_SHOW = 5;
uint appThread = GetCurrentThreadId();
uint foregroundThread = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);
if (foregroundThread != appThread)
{
AttachThreadInput(foregroundThread, appThread, true);
BringWindowToTop(hWnd);
ShowWindow(hWnd, SW_SHOW);
AttachThreadInput(foregroundThread, appThread, false);
}
else
{
BringWindowToTop(hWnd);
ShowWindow(hWnd, SW_SHOW);
}
}
jedoch beide Fenster so schnell verlieren konzentrieren, da die Fäden lösen.
Wenn ich darauf warte, dass die Nachrichtenwarteschlange leer wird (Application.DoEvents()) und mein Fenster aktiviert (das jetzt im Vordergrund aber nicht fokussiert ist), wird es den Fokus wieder erlangen und behalten.
Wenn ich es vor der Nachrichtenwarteschlange zu tun ist leer wird es wieder den Fokus verlieren.
Also ich würde vermuten, etwas von der Ablösung nimmt den Fokus von meinen Fenstern, aber ich habe keine Ahnung, was das ist oder wie man es verhindert.
Dies ist die erste Sache, die ich nicht ganz verstehen.
Die zweite Sache, die ich nicht bekommen, ist, wenn ich mein Fenster nicht den Vordergrund gesetzt:
AttachThreadInput(foregroundThread, appThread, true);
AttachThreadInput(foregroundThread, appThread, false);
Application.DoEvents();
this.Activate();
Warten auf die Nachrichtenwarteschlange leer, und meine Fenster aktivieren (diesmal ist es nicht im Vordergrund und das andere Fenster hat immer noch den Fokus), es wird tatsächlich aktiviert, obwohl die Threads nicht mehr angehängt sind.
vielleicht jemand mit einem besseren Verständnis der AttachThreadInput kann mir diese 2 Fragen beantworten.
INFO:
Ich brauche den Fokus in diesem Fall zu stehlen, weil meine App über eine API aufgerufen wird. Die andere App, die meins aufruft, wartet auf Feedback von meiner App und friert in den meisten Fällen ein, bis sie die Info bekommt.
Wenn die andere App Vollbild ist, bemerken viele Benutzer nicht das Blinken in der Taskleiste und denken, dass die andere App abgestürzt ist und töte sie mit dem Taskmanager. Da ich nicht unbedingt die Kontrolle über die andere App habe, kann ich nicht sagen, dass sie den Fokus auf mein Fenster legen soll.
Diese Methode wird nicht aufgerufen, wenn es nicht absolut notwendig ist, in diesem Fall wird dieses Verhalten, das feindselig ist, ich weiß, auch von mir selbst als vom Benutzer gewollt.
Sie können feststellen, [diese] (http://blogs.msdn.com/b/oldnewthing/archive/2013/06/19/10426841.aspx) und [diese] (http: // blogs. msdn.com/b/oldnewthing/archive/2008/08/01/8795860.aspx) ziemlich interessant. –
Nun, beide Links sagen mir, wie schlecht ich Thread-Input anhängen will, nicht wahr? Oder gibt es noch etwas, das ich vermisst habe? Ich weiß, das ist keine gewöhnliche Übung, und es sollte zu fast allen Kosten verhindert werden, aber in meinem Fall muss ich es tatsächlich tun. – Visions
Wohlgemerkt, ich bin hier kein Experte, aber habe erst kürzlich diesen einen Artikel gelesen.Nachdem dies gesagt wurde, möchten Sie vielleicht die ersten Zeilen Ihres Codefragments mit den ersten Zeilen in [diesem Beispiel] vergleichen (http://blogs.msdn.com/b/oldnewthing/archive/2013/06/19/10426841). aspx). Aus einer lockeren Sicht mögen sie ziemlich identisch (und damit den Artikel "falsch"). YMMV natürlich. –