2016-04-15 18 views
1

Ich habe eine Anwendung, die als "Application Desktop Toolbar" oder kurz appbar funktioniert. Es ist in WPF implementiert und Appbar-Funktionalität wird hinzugefügt, indem diese Richtlinie folgt: https://msdn.microsoft.com/en-us/library/windows/desktop/cc144177(v=vs.85).aspx.Eine AppBar-Anwendung funktioniert nicht korrekt in Windows 8.x/10 (Desktop-Arbeitsbereich wird nicht für mehrere Appbars reduziert)

Alles funktioniert in Windows 7 in Ordnung, aber in Windows 8.1 (oder wahrscheinlich in Windows 8.x) geschieht Folgendes:

  1. Die erste appbar auf einer Anzeigeseite angedockt wird korrekt angezeigt und Arbeits des Windows-Desktop Bereich wird entsprechend reduziert, so dass die Appbar keine Fenster überlappt.
  2. Die zweite Appbar, die auf der gleichen Seite des Displays wie die erste angedockt ist, wird an der richtigen Position angezeigt, aber der Arbeitsbereich des Windows-Desktops wird nicht verkleinert. Die zweite Appbar überlappt nun andere Fenster.
  3. Die dritte AppBar auf der gleichen Seite des Displays gedockt wirkt identisch mit dem zweiten
  4. Die vierte (und alle appbars danach) erhalten platziert über/unter dem vorherigen drei, appbars so effektiv zu verschwinden beginnen

Was 2 codewise geschieht in Schritt das ist (ausgetestet in Windows 8.1):

SHAppBarMessage ((int) ABMsg.ABM_QUERYPOS, ref BarData) aufrufen;

gibt die korrekt eingestellten Koordinaten für die neue Appbar zurück. Aber dann ruft

SHAppBarMessage ((int) ABMsg.ABM_SETPOS, ref barData);

scheint nicht "durchzulaufen", was bedeutet, dass es ok ausgeführt wird, und später wird das Fenster an der richtigen Position (definiert in barData) gesetzt. Aber der Arbeitsbereich wird nicht reduziert, was nach meinem Verständnis durch diesen Funktionsaufruf geschehen sollte.

Was in Schritt 4 passiert, ist, dass SHAppBarMessage ((int) ABMsg.ABM_QUERYPOS, ref barData) falsche Koordinaten zurückgibt, die die gleichen wie bereits vorhandene Appbars sind. Dies hat zur Folge, dass Appbars sich gegenseitig überlappen.

Das gleiche Problem tritt in Windows 10 auf, scheint aber mit ernsteren Nebenwirkungen: meine Appbar-Anwendung stürzt ziemlich schnell mit mehreren appbar-Instanzen ab, wodurch das ganze Windows-Betriebssystem für ein paar Minuten zum Stillstand kommt.

Ich habe das Web ziemlich ausführlich gesucht, aber habe keine Lösung gefunden. Fand diesen Artikel aber https://github.com/PhilipRieck/WpfAppBar/issues/4, wo die Symptome ziemlich ähnlich zu denen mit meiner App sind.

Jede Hilfe würde sehr geschätzt werden. Meine Vermutung ist, dass dies ein Fehler mit der SHAppBarMessage-API in Windows 8.x/10 ist. Aber wird nicht aufhören zu schauen, bis es bestätigt wird, so zu sein, oder noch besser, eine Lösung gefunden wird.

+0

Hallo Jone, Irgendwelche Glück in dieser Frage? Ich sehe das auch gleich. Wir haben WPF AppBar-Anwendung, die in Win 7 gut funktioniert und Probleme in Win 10-Oberflächenmaschinen. –

+0

Bisher keine Würfel .. – Jone

Antwort

-2

In Windows 8 und Windows 10 gibt ABM_QUERYPOS beim ersten Aufruf nicht immer die korrekte Position zurück. Aber, ABM_QUERYPOS erneut aufrufen, erhält von Windows die richtige Position. Abhängig von der Anzahl der App-Bars. Als Probe erhält dieser Code die richtige Position:

 APPBARDATA abd = new APPBARDATA(); 
     abd.cbSize = Marshal.SizeOf(abd); 
     abd.hWnd = this.Handle; 
     abd.uEdge = (int)ABEdge.ABE_TOP; 
     abd.rc.left = 0; 
     abd.rc.right = SystemInformation.PrimaryMonitorSize.Width; 
     abd.rc.top = 0; 
     abd.rc.bottom = Size.Height; 

     // Query the system for an approved size and position. 
     int top = abd.rc.top; 
     for (;;) 
     { 
      SHAppBarMessage((int)ABMsg.ABM_QUERYPOS, ref abd); 
      if (top == abd.rc.top) 
       break; 
      top = abd.rc.top; 
      abd.rc.bottom = abd.rc.top + Size.Height; 
     } 

Desktop-Bereich nicht immer in Windows 8 oder Windows korrekt geändert 10, wie es in Windows 7. Für den Moment ist, kann der Desktop-Bereich eingestellt werden mit dem nächsten Code. In Windows 10 vermeiden Sie SPIF_SENDWININICHANGE, funktioniert nicht.

private const Int32 SPIF_change = SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE; 

     MoveWindow(abd.hWnd, abd.rc.left, abd.rc.top, 
      abd.rc.right - abd.rc.left, abd.rc.bottom - abd.rc.top, true); 


      RECT final_working_area = new RECT(); 
      result = SystemParametersInfo(SPI_GETWORKAREA, 
                0, 
                ref final_working_area, 
                SPIF_change); 
      // Verify working area was adjusted 
      if (final_working_area.top < abd.rc.bottom) 
      { 
       final_working_area.top = abd.rc.bottom; 
       result = SystemParametersInfo(SPI_SETWORKAREA, 
                 0, 
                 ref final_working_area, 
                 SPIF_change); 
      } 
+0

Dies liefert keine Antwort auf die Frage. Sobald Sie genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment); stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (http://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Bewertung] (/ review/low-quality-posts/12880536) – MLavoie

+0

Vielen Dank, ich versuche zu helfen, und einen Hinweis, ich hoffe, ein Experte mit genügend Ruf bieten die endgültige Lösung.Ich denke auch, es gibt einige Fehler im Zusammenhang mit ABM_QUERYPOS und SPI_SETWORKAREA. – pslzr

+0

@pslzr: Vielen Dank für Ihre Hinweise. Richtig, wenn ABM_QUERYPOS einige Male aufgerufen wird, wird Windows schließlich die richtige Position angeben. Aber das größte Problem ist mit dem Arbeitsbereich, der nicht entgegenkommt. Es wäre eine beängstigende Aufgabe, den Arbeitsbereich durch explizites Festlegen im Code zu bearbeiten, da eine beliebige Anzahl von Appbars an einer beliebigen Seite des Bildschirms angedockt sein kann. Ich denke, es wäre unmöglich, es robust zu verwalten. Je mehr Stunden ich habe, bin ich mir fast sicher, dass dies ein Windows-Bug ist. Ich hoffe wirklich auf eine Lösung, da dies ein großes Problem für meine App-Nutzung ist. – Jone