2016-04-15 54 views
1

「アプリケーションデスクトップツールバー」または略してappbarとして機能するアプリケーションがあります。これはWPFで実装されており、このガイドラインに従うことでAppbarの機能が追加されています:https://msdn.microsoft.com/en-us/library/windows/desktop/cc144177(v=vs.85).aspxWindows 8.x/10で正しく動作しないAppBarアプリケーション(複数のアプリケーションバーではデスクトップの作業領域が縮小されません)

すべてがWindows 7で正常に動作しますが、Windows 8.1で(またはWindows 8.xの可能性が高い)次の処理が行われます。Windowsデスクトップの作業を

  1. ディスプレイの側にドッキング最初のアプリケーションバーが正しく表示され、エリアがそれに応じて縮小されるので、Appbarはウィンドウと重複しません。
  2. ディスプレイの同じ側にドッキングされた2番目のアプレットが正しい位置に表示されますが、Windowsデスクトップの作業領域は縮小されません。したがって、2番目のAppbarは他のウィンドウと重複しています。
  3. ディスプレイの同じ側にドッキング第三のアプリケーションバーを用いて同様に作用する第1
  4. 前の3つの下/上に配置され得る第四の(およびそれ結局appbars)は、それほど効果的に消滅し始めるappbars

何ステップ2 codewiseで発生する(Windowsの8.1でデバッグ)これです:

SHAppBarMessage((int型)ABMsg.ABM_QUERYPOS、REF barData)を呼び出します。

は、新しいappbarの正しく調整された座標を返します。しかし、次に呼び出します

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

は「通過する」とは思われません。つまり、okが実行され、後でウィンドウが正しい位置(barDataで定義された位置)に設定されます。しかし、作業領域は縮小されていません。この関数呼び出しで私の理解が必要です。

ステップ4では、SHAppBarMessage((int)ABMsg.ABM_QUERYPOS、ref barData)が、すでに存在するappbarsと同じような不正な座標を返すようになります。その結果、appbarsは互いに重なり合うことになります。

同じ問題がWindows 10で発生しますが、より深刻な副作用があるようです。私のappbarアプリケーションは複数のappbarインスタンスで非常に迅速にクラッシュし、Windows OS全体を数分間停止させます。

私はかなり広範にウェブを検索しましたが、解決策は見つかりませんでした。しかし、この記事を見つけたのはhttps://github.com/PhilipRieck/WpfAppBar/issues/4で、私のアプリの症状はかなり似ています。

ご協力いただければ幸いです。私の推測では、これはWindows 8.x/10のSHAppBarMessage APIのバグです。しかし、それがそうであることが確認されるか、またはより良いことが確認されるまで、見た目は止まらないだろう。

+0

こんにちは、この問題で運がいいですか?私も同じことに直面しています。 Win 7でうまく動作し、Win 10サーフェスマシンで問題が発生したWPF AppBarアプリケーションがあります。 –

+0

これまでのところ、ダイスはありません。 – Jone

答えて

-2

ウィンドウ8およびウィンドウ10では、ABM_QUERYPOSが最初の呼び出しで常に正しい位置を返すとは限りません。しかし、ABM_QUERYPOSを再度呼び出すと、Windowsから正しい位置が取得されます。アプリバーの数に応じて。試料として は、このコードは、正しい位置を取得します。それは現時点ではWindows 7の であるよう

 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; 
     } 

デスクトップ領域が常に正しくのWindows 8またはWindows 10で修正されていない、デスクトップ領域を調整することができます次のコードで。 Windowsでは、 SPIF_SENDWININICHANGEを使用しないで、動作していません。

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

これは質問に対する答えを提供しません。十分な[評判](http://stackoverflow.com/help/whats-reputation)があれば、[任意の投稿にコメントする]ことができます(http://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの説明を必要としない回答を提供する](http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューの投稿](レビュー/低品質の投稿/ 12880536) – MLavoie

+0

ありがとう、私は助けて、ヒントを提供しようとしています、私は十分な評判を持つ専門家が最終的な解決策を提供することを願っています。 ABM_QUERYPOSに関連するバグ、およびSPI_SETWORKAREAに関連するバグ。 – pslzr

+0

@pslzr:あなたのヒントをありがとう。実際、ABM_QUERYPOSを数回呼び出すと、最終的に正しい位置を与えるWindowsが最終的に終了します。しかし、最大の問題は、作業領域が適応していないことです。 作業領域をコード内に明示的に設定することによって、作業領域を処理しようとするのは大変な作業です。ディスプレイの任意の数にappbarsがドッキングされている場合があります。私はそれを堅牢に管理することは不可能だと思います。 私がこれに入れた時間が増えると、これはWindowsのバグであることがほぼ確実です。これは私のアプリの使い方にとって大きな問題なので、修正をお願いします。 – Jone

関連する問題