QA@IT
«質問へ戻る

2
本文
     {
         string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
         string controlText = acc.get_accName(i);
+        Debug.WriteLine("controlType : " + controlType + ", ControlText : " + controlText);
     }
 ..
 }

C# 他アプリで選択したメニューの項目名を取得したい。

お世話になります。

他アプリの動作を監視し、キーボードのみでアプリケーションを操作した際、
ユーザがそのアプリケーションでどの様なメニュー操作をしたのかを
取得したいと思っています。

具体的には、例えばメモ帳で「Alt + F」「↓キー」「ENTERキー」の順に入力すると、
「ファイル」メニューの「開く」が選ばれる訳ですが、ENTER押下のタイミングで
”開く”という、選択されたメニューアイテムの文字列を取得したいと思っています。

そこでどこまで取得出来るか、以下の様なコードを組んでみました。

Accessibility コンポーネントを参照設定

[DllImport("oleacc.dll")]
public static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);

private static IntPtr GetFocusedHandleFromProcessWithWindow(IntPtr window)
{
    var threadId = GetWindowThreadProcessId(window, IntPtr.Zero);
    var info = new GuiThreadInfo();
    info.cbSize = Marshal.SizeOf(info);
    if (!GetGUIThreadInfo(threadId, ref info)) return window;
    return info.hwndFocus;
}

private static void GetActiveControlName()
{
    // アクティブなウィンドウハンドルの取得
        IntPtr hWnd = GetForegroundWindow();
    IntPtr hWndControl = GetFocusedHandleFromProcessWithWindow(hWnd);
    CKeyControl ctrl = new CKeyControl();
    string retVal = String.Empty;
    Accessibility.IAccessible acc = null;
    object childId = null;

    Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
    object obj = null;
    int num = AccessibleObjectFromWindow(hWndControl, (uint)OBJID.OBJID_MENU, ref guid, ref obj);
    acc = (Accessibility.IAccessible)obj;
    int childCount = acc.accChildCount;

    for (int i = 0; i < childCount; i++)
    {
        string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
        string controlText = acc.get_accName(i);
        Debug.WriteLine("controlType : " + controlType + ", ControlText : " + controlText);
    }
..
}

しかしこれでは、どのキー操作のタイミングでも

controlType : MenuBar
ControlText : アプリケーション

controlType : MenuItem
ControlText : ファイル(F)

controlType : MenuItem
ControlText : 編集(E)

controlType : MenuItem
ControlText : 表示(V)
...

といった、メニューバー本体の内容までしか取得出来ず困っています。

ENTERを押した時点の、メニューでフォーカスがあるアイテムの
テキストを得るために、何かアイデアなどございますでしょうか。

宜しくお願い致します。

お世話になります。

他アプリの動作を監視し、キーボードのみでアプリケーションを操作した際、
ユーザがそのアプリケーションでどの様なメニュー操作をしたのかを
取得したいと思っています。

具体的には、例えばメモ帳で「Alt + F」「↓キー」「ENTERキー」の順に入力すると、
「ファイル」メニューの「開く」が選ばれる訳ですが、ENTER押下のタイミングで
”開く”という、選択されたメニューアイテムの文字列を取得したいと思っています。

そこでどこまで取得出来るか、以下の様なコードを組んでみました。

# Accessibility コンポーネントを参照設定

```
[DllImport("oleacc.dll")]
public static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);

private static IntPtr GetFocusedHandleFromProcessWithWindow(IntPtr window)
{
    var threadId = GetWindowThreadProcessId(window, IntPtr.Zero);
    var info = new GuiThreadInfo();
    info.cbSize = Marshal.SizeOf(info);
    if (!GetGUIThreadInfo(threadId, ref info)) return window;
    return info.hwndFocus;
}

private static void GetActiveControlName()
{
    // アクティブなウィンドウハンドルの取得
        IntPtr hWnd = GetForegroundWindow();
    IntPtr hWndControl = GetFocusedHandleFromProcessWithWindow(hWnd);
    CKeyControl ctrl = new CKeyControl();
    string retVal = String.Empty;
    Accessibility.IAccessible acc = null;
    object childId = null;

    Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
    object obj = null;
    int num = AccessibleObjectFromWindow(hWndControl, (uint)OBJID.OBJID_MENU, ref guid, ref obj);
    acc = (Accessibility.IAccessible)obj;
    int childCount = acc.accChildCount;

    for (int i = 0; i < childCount; i++)
    {
        string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
        string controlText = acc.get_accName(i);
        Debug.WriteLine("controlType : " + controlType + ", ControlText : " + controlText);
    }
..
}
```

しかしこれでは、どのキー操作のタイミングでも

controlType : MenuBar
ControlText : アプリケーション

controlType : MenuItem
ControlText : ファイル(F)

controlType : MenuItem
ControlText : 編集(E)

controlType : MenuItem
ControlText : 表示(V)
...

といった、メニューバー本体の内容までしか取得出来ず困っています。

ENTERを押した時点の、メニューでフォーカスがあるアイテムの
テキストを得るために、何かアイデアなどございますでしょうか。

宜しくお願い致します。

2
本文
 そこでどこまで取得出来るか、以下の様なコードを組んでみました。
 
 # Accessibility コンポーネントを参照設定
+
 ```
 [DllImport("oleacc.dll")]
 public static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
 [In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);
 
-~~~
-// アクティブなウィンドウハンドルの取得
-IntPtr hWnd = GetForegroundWindow();
-IntPtr hWndControl = GetFocusedHandleFromProcessWithWindow(hWnd);
-CKeyControl ctrl = new CKeyControl();
-string retVal = String.Empty;
-Accessibility.IAccessible acc = null;
-object childId = null;
+private static IntPtr GetFocusedHandleFromProcessWithWindow(IntPtr window)
+{
+    var threadId = GetWindowThreadProcessId(window, IntPtr.Zero);
+    var info = new GuiThreadInfo();
+    info.cbSize = Marshal.SizeOf(info);
+    if (!GetGUIThreadInfo(threadId, ref info)) return window;
+    return info.hwndFocus;
+}
 
-Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
-object obj = null;
-int num = AccessibleObjectFromWindow(hWndControl, (uint)OBJID.OBJID_MENU, ref guid, ref obj);
-acc = (Accessibility.IAccessible)obj;
-int childCount = acc.accChildCount;
-
-for (int i = 0; i < childCount; i++)
+private static void GetActiveControlName()
 {
-    string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
-    string controlText = acc.get_accName(i);
+    // アクティブなウィンドウハンドルの取得
+        IntPtr hWnd = GetForegroundWindow();
+    IntPtr hWndControl = GetFocusedHandleFromProcessWithWindow(hWnd);
+    CKeyControl ctrl = new CKeyControl();
+    string retVal = String.Empty;
+    Accessibility.IAccessible acc = null;
+    object childId = null;
+
+    Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
+    object obj = null;
+    int num = AccessibleObjectFromWindow(hWndControl, (uint)OBJID.OBJID_MENU, ref guid, ref obj);
+    acc = (Accessibility.IAccessible)obj;
+    int childCount = acc.accChildCount;
+
+    for (int i = 0; i < childCount; i++)
+    {
+        string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
+        string controlText = acc.get_accName(i);
+    }
+..
 }
 ```
 

C# 他アプリで選択したメニューの項目名を取得したい。

お世話になります。

他アプリの動作を監視し、キーボードのみでアプリケーションを操作した際、
ユーザがそのアプリケーションでどの様なメニュー操作をしたのかを
取得したいと思っています。

具体的には、例えばメモ帳で「Alt + F」「↓キー」「ENTERキー」の順に入力すると、
「ファイル」メニューの「開く」が選ばれる訳ですが、ENTER押下のタイミングで
”開く”という、選択されたメニューアイテムの文字列を取得したいと思っています。

そこでどこまで取得出来るか、以下の様なコードを組んでみました。

Accessibility コンポーネントを参照設定

[DllImport("oleacc.dll")]
public static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);

private static IntPtr GetFocusedHandleFromProcessWithWindow(IntPtr window)
{
    var threadId = GetWindowThreadProcessId(window, IntPtr.Zero);
    var info = new GuiThreadInfo();
    info.cbSize = Marshal.SizeOf(info);
    if (!GetGUIThreadInfo(threadId, ref info)) return window;
    return info.hwndFocus;
}

private static void GetActiveControlName()
{
    // アクティブなウィンドウハンドルの取得
        IntPtr hWnd = GetForegroundWindow();
    IntPtr hWndControl = GetFocusedHandleFromProcessWithWindow(hWnd);
    CKeyControl ctrl = new CKeyControl();
    string retVal = String.Empty;
    Accessibility.IAccessible acc = null;
    object childId = null;

    Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
    object obj = null;
    int num = AccessibleObjectFromWindow(hWndControl, (uint)OBJID.OBJID_MENU, ref guid, ref obj);
    acc = (Accessibility.IAccessible)obj;
    int childCount = acc.accChildCount;

    for (int i = 0; i < childCount; i++)
    {
        string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
        string controlText = acc.get_accName(i);
    }
..
}

しかしこれでは、どのキー操作のタイミングでも

controlType : MenuBar
ControlText : アプリケーション

controlType : MenuItem
ControlText : ファイル(F)

controlType : MenuItem
ControlText : 編集(E)

controlType : MenuItem
ControlText : 表示(V)
...

といった、メニューバー本体の内容までしか取得出来ず困っています。

ENTERを押した時点の、メニューでフォーカスがあるアイテムの
テキストを得るために、何かアイデアなどございますでしょうか。

宜しくお願い致します。

お世話になります。

他アプリの動作を監視し、キーボードのみでアプリケーションを操作した際、
ユーザがそのアプリケーションでどの様なメニュー操作をしたのかを
取得したいと思っています。

具体的には、例えばメモ帳で「Alt + F」「↓キー」「ENTERキー」の順に入力すると、
「ファイル」メニューの「開く」が選ばれる訳ですが、ENTER押下のタイミングで
”開く”という、選択されたメニューアイテムの文字列を取得したいと思っています。

そこでどこまで取得出来るか、以下の様なコードを組んでみました。

# Accessibility コンポーネントを参照設定

```
[DllImport("oleacc.dll")]
public static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);

private static IntPtr GetFocusedHandleFromProcessWithWindow(IntPtr window)
{
    var threadId = GetWindowThreadProcessId(window, IntPtr.Zero);
    var info = new GuiThreadInfo();
    info.cbSize = Marshal.SizeOf(info);
    if (!GetGUIThreadInfo(threadId, ref info)) return window;
    return info.hwndFocus;
}

private static void GetActiveControlName()
{
    // アクティブなウィンドウハンドルの取得
        IntPtr hWnd = GetForegroundWindow();
    IntPtr hWndControl = GetFocusedHandleFromProcessWithWindow(hWnd);
    CKeyControl ctrl = new CKeyControl();
    string retVal = String.Empty;
    Accessibility.IAccessible acc = null;
    object childId = null;

    Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
    object obj = null;
    int num = AccessibleObjectFromWindow(hWndControl, (uint)OBJID.OBJID_MENU, ref guid, ref obj);
    acc = (Accessibility.IAccessible)obj;
    int childCount = acc.accChildCount;

    for (int i = 0; i < childCount; i++)
    {
        string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
        string controlText = acc.get_accName(i);
    }
..
}
```

しかしこれでは、どのキー操作のタイミングでも

controlType : MenuBar
ControlText : アプリケーション

controlType : MenuItem
ControlText : ファイル(F)

controlType : MenuItem
ControlText : 編集(E)

controlType : MenuItem
ControlText : 表示(V)
...

といった、メニューバー本体の内容までしか取得出来ず困っています。

ENTERを押した時点の、メニューでフォーカスがあるアイテムの
テキストを得るために、何かアイデアなどございますでしょうか。

宜しくお願い致します。

2
本文
 [In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);
 
 ~~~
+// アクティブなウィンドウハンドルの取得
+IntPtr hWnd = GetForegroundWindow();
+IntPtr hWndControl = GetFocusedHandleFromProcessWithWindow(hWnd);
+CKeyControl ctrl = new CKeyControl();
+string retVal = String.Empty;
+Accessibility.IAccessible acc = null;
+object childId = null;
 
 Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
 object obj = null;

C# 他アプリで選択したメニューの項目名を取得したい。

お世話になります。

他アプリの動作を監視し、キーボードのみでアプリケーションを操作した際、
ユーザがそのアプリケーションでどの様なメニュー操作をしたのかを
取得したいと思っています。

具体的には、例えばメモ帳で「Alt + F」「↓キー」「ENTERキー」の順に入力すると、
「ファイル」メニューの「開く」が選ばれる訳ですが、ENTER押下のタイミングで
”開く”という、選択されたメニューアイテムの文字列を取得したいと思っています。

そこでどこまで取得出来るか、以下の様なコードを組んでみました。

Accessibility コンポーネントを参照設定

[DllImport("oleacc.dll")]
public static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);

// アクティブなウィンドウハンドルの取得
IntPtr hWnd = GetForegroundWindow();
IntPtr hWndControl = GetFocusedHandleFromProcessWithWindow(hWnd);
CKeyControl ctrl = new CKeyControl();
string retVal = String.Empty;
Accessibility.IAccessible acc = null;
object childId = null;

Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
object obj = null;
int num = AccessibleObjectFromWindow(hWndControl, (uint)OBJID.OBJID_MENU, ref guid, ref obj);
acc = (Accessibility.IAccessible)obj;
int childCount = acc.accChildCount;

for (int i = 0; i < childCount; i++)
{
string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
string controlText = acc.get_accName(i);
}


しかしこれでは、どのキー操作のタイミングでも

controlType : MenuBar
ControlText : アプリケーション

controlType : MenuItem
ControlText : ファイル(F)

controlType : MenuItem
ControlText : 編集(E)

controlType : MenuItem
ControlText : 表示(V)
...

といった、メニューバー本体の内容までしか取得出来ず困っています。

ENTERを押した時点の、メニューでフォーカスがあるアイテムの
テキストを得るために、何かアイデアなどございますでしょうか。

宜しくお願い致します。
お世話になります。

他アプリの動作を監視し、キーボードのみでアプリケーションを操作した際、
ユーザがそのアプリケーションでどの様なメニュー操作をしたのかを
取得したいと思っています。

具体的には、例えばメモ帳で「Alt + F」「↓キー」「ENTERキー」の順に入力すると、
「ファイル」メニューの「開く」が選ばれる訳ですが、ENTER押下のタイミングで
”開く”という、選択されたメニューアイテムの文字列を取得したいと思っています。

そこでどこまで取得出来るか、以下の様なコードを組んでみました。

# Accessibility コンポーネントを参照設定
```
[DllImport("oleacc.dll")]
public static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);

~~~
// アクティブなウィンドウハンドルの取得
IntPtr hWnd = GetForegroundWindow();
IntPtr hWndControl = GetFocusedHandleFromProcessWithWindow(hWnd);
CKeyControl ctrl = new CKeyControl();
string retVal = String.Empty;
Accessibility.IAccessible acc = null;
object childId = null;

Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
object obj = null;
int num = AccessibleObjectFromWindow(hWndControl, (uint)OBJID.OBJID_MENU, ref guid, ref obj);
acc = (Accessibility.IAccessible)obj;
int childCount = acc.accChildCount;

for (int i = 0; i < childCount; i++)
{
    string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
    string controlText = acc.get_accName(i);
}
```

しかしこれでは、どのキー操作のタイミングでも

controlType : MenuBar
ControlText : アプリケーション

controlType : MenuItem
ControlText : ファイル(F)

controlType : MenuItem
ControlText : 編集(E)

controlType : MenuItem
ControlText : 表示(V)
...

といった、メニューバー本体の内容までしか取得出来ず困っています。

ENTERを押した時点の、メニューでフォーカスがあるアイテムの
テキストを得るために、何かアイデアなどございますでしょうか。

宜しくお願い致します。

質問を投稿

C# 他アプリで選択したメニューの項目名を取得したい。

お世話になります。

他アプリの動作を監視し、キーボードのみでアプリケーションを操作した際、
ユーザがそのアプリケーションでどの様なメニュー操作をしたのかを
取得したいと思っています。

具体的には、例えばメモ帳で「Alt + F」「↓キー」「ENTERキー」の順に入力すると、
「ファイル」メニューの「開く」が選ばれる訳ですが、ENTER押下のタイミングで
”開く”という、選択されたメニューアイテムの文字列を取得したいと思っています。

そこでどこまで取得出来るか、以下の様なコードを組んでみました。

Accessibility コンポーネントを参照設定

[DllImport("oleacc.dll")]
public static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);

Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
object obj = null;
int num = AccessibleObjectFromWindow(hWndControl, (uint)OBJID.OBJID_MENU, ref guid, ref obj);
acc = (Accessibility.IAccessible)obj;
int childCount = acc.accChildCount;

for (int i = 0; i < childCount; i++)
{
string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
string controlText = acc.get_accName(i);
}


しかしこれでは、どのキー操作のタイミングでも

controlType : MenuBar
ControlText : アプリケーション

controlType : MenuItem
ControlText : ファイル(F)

controlType : MenuItem
ControlText : 編集(E)

controlType : MenuItem
ControlText : 表示(V)
...

といった、メニューバー本体の内容までしか取得出来ず困っています。

ENTERを押した時点の、メニューでフォーカスがあるアイテムの
テキストを得るために、何かアイデアなどございますでしょうか。

宜しくお願い致します。
お世話になります。

他アプリの動作を監視し、キーボードのみでアプリケーションを操作した際、
ユーザがそのアプリケーションでどの様なメニュー操作をしたのかを
取得したいと思っています。

具体的には、例えばメモ帳で「Alt + F」「↓キー」「ENTERキー」の順に入力すると、
「ファイル」メニューの「開く」が選ばれる訳ですが、ENTER押下のタイミングで
”開く”という、選択されたメニューアイテムの文字列を取得したいと思っています。

そこでどこまで取得出来るか、以下の様なコードを組んでみました。

# Accessibility コンポーネントを参照設定
```
[DllImport("oleacc.dll")]
public static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);

~~~

Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
object obj = null;
int num = AccessibleObjectFromWindow(hWndControl, (uint)OBJID.OBJID_MENU, ref guid, ref obj);
acc = (Accessibility.IAccessible)obj;
int childCount = acc.accChildCount;

for (int i = 0; i < childCount; i++)
{
    string controlType = Enum.ToObject(typeof(System.Windows.Forms.AccessibleRole), acc.get_accRole(i)).ToString();
    string controlText = acc.get_accName(i);
}
```

しかしこれでは、どのキー操作のタイミングでも

controlType : MenuBar
ControlText : アプリケーション

controlType : MenuItem
ControlText : ファイル(F)

controlType : MenuItem
ControlText : 編集(E)

controlType : MenuItem
ControlText : 表示(V)
...

といった、メニューバー本体の内容までしか取得出来ず困っています。

ENTERを押した時点の、メニューでフォーカスがあるアイテムの
テキストを得るために、何かアイデアなどございますでしょうか。

宜しくお願い致します。