3

以下のコードを使用して、別のアプリケーションのウィンドウ内のComboBoxからアイテムのリストを取得しています。このコードは、このコードをテストした他のアプリケーションのComboBoxに対して機能します(アイテムのリストを正しく取得します)が、この特定のアプリケーションでは、各ListItemに対して取得されたNameプロパティが文字化けします。

コードは次のとおりです。

using System.Windows.Automation;

var condition = new PropertyCondition(AutomationElement.NameProperty, "Change/Add/Delete Setting");
var condition2 = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window);
var condition3 = new AndCondition(new Condition[] {condition, condition2});
var window = AutomationElement.RootElement.FindFirst(TreeScope.Subtree, condition3);

condition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ComboBox);
var combo = window.FindFirst(TreeScope.Subtree, condition);

condition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ListItem);
AutomationElementCollection children = combo.FindAll(TreeScope.Subtree, condition);

var comboItems = new List<string>();
foreach (AutomationElement child in children)
{
    comboItems.Add(child.Current.Name);
}

そして、これがこの1つのアプリの最終的なスクリーンショットです。

代替テキスト

  • Nameプロパティがこのように文字化けする原因は何ですか?これはエンコーディングの問題でしょうか?
  • 各アイテムの正しいテキストを取得するにはどうすればよいですか?
4

1 に答える 1

3

このコンボボックスにCBS_OWNERDRAWFIXEDまたはCBS_OWNERDRAWVARIABLEスタイルがある場合、または含まれるリストボックスにLBS_OWNERDRAWFIXEDまたはLBS_OWNERDRAWVARIABLEスタイルがある場合。その場合、テキストはコントロールによってまったく認識されません。アプリがこれらのスタイルのいずれかを使用すると、コントロールが描画する必要があるたびに WM_DRAWITEM メッセージを取得し、ポケットからテキストを取得して、要求された場所に描画します。

これは、アプリケーションがリストボックスまたはコンボボックスの内容をその場ですばやく簡単に変更できるようにするトリックです。内容が揮発性である場合、またはアイテムがたくさんある場合に主に使用されます。リストボックス/コンボボックスが保持できる項目数の制限を回避する 1 つの方法です。

これらのウィンドウのスタイルを確認するには、Spy++ を使用します。

于 2009-12-21T01:03:28.240 に答える