Visual Studioでプロセスにアタッチするとウィンドウが二重になるのはなぜか?
Q&A
Closed
解決したいこと
WindowsでWPFアプリを開発しています。
このアプリで生成したウィンドウがシステム標準の「音量ミキサー」に加わるとき、音量ミキサーはアプリの(EXEの)アイコンではなく、ウィンドウに設定したアイコンを表示するようです。
できればそれを避けたい(表示するならアプリのアイコンにしてほしい)、というのが、本来解決したいことです。とは言え、音量ミキサー自体を変えることは当然できないわけですが、何か回避できる方法が無いかを探っています。
質問したいこと
そのためいろいろ試行錯誤している中で、次のことに気が付きました。
アプリを単純に実行した場合は上記のとおりなのですが、Visual Studioで「デバッグの開始」で実行するか、実行後に「プロセスにアタッチ」すると、音量ミキサーはアプリのアイコンを表示するようでした。
それはなぜかを調べるため GUIPropView でシステムが開いているウィンドウを観察してみたところ、デバッガーアタッチしているときは、GUIPropVeiw に表示されるウィンドウの数が倍になります。各ウィンドウの親ハンドルを見るに、アプリが作成したすべてのウィンドウに子ウィンドウが付加されているような形に見えます。そしてそれらの子ウィンドウのアイコンは、親ウィンドウのアイコンではなく、アプリのアイコンになっています。おそらくこのとき音量ミキサーがウィンドウのアイコンを取得するとき、子ウィンドウのほうが参照されているのではないかと推測しています。
長くなりましたが、とりあえず質問したいことは、デバッガーアタッチしていると、なぜそのようなことが起こるのか?を知りたいです。
(そして、もし同じ状態を簡単に作れたら、それで上記の問題を回避できるのではないか?と思っています)。
ご存じの方がいらっしゃいましたら教えてください。
ソースコード
下記のシンプルなコードでも確認することができました。
(たまたま以前何かのために書いたテストコードが残っていたのを使ってみただけなので、この内容へのツッコミは不要です)
C#
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
XAML
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Height="450" Width="800">
<Grid>
<ListView>
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="Menu Item 1" />
<MenuItem Header="Menu Item 2" />
</ContextMenu>
</ListView.ContextMenu>
<ListView.Items>
<ListViewItem>Item 1</ListViewItem>
<ListViewItem>Item 2</ListViewItem>
<ListViewItem>Item 3</ListViewItem>
<ListViewItem>Item 4</ListViewItem>
<ListViewItem>Item 5</ListViewItem>
</ListView.Items>
</ListView>
</Grid>
</Window>