<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[GetMenuItemInfo liefert String von Items nicht]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Ich versuche das Menü einer fremden Anwendung auszulesen (genauer: ICQ Statusauswahl). Jedoch gibt GetMenuItemInfo nicht den Text der Menüeinträge zurück:</p>
<pre><code class="language-cpp">HMENU hMenu = (HMENU)::SendMessage (hWnd, MN_GETHMENU, 0, 0); // hWnd stimmt, hMenu stimmt
if (IsMenu (hMenu))
{
	MENUITEMINFO mii;
	mii.cbSize = sizeof (mii);
	mii.fMask = MIIM_STRING;

	UINT iCount = ::GetMenuItemCount (hMenu);

	for (UINT i = 0; i &lt; iCount; i++)
	{
		mii.dwTypeData = cBuffer1;  // TCHAR cBuffer1[4096]
		mii.cch = sizeof (cBuffer1) / sizeof (TCHAR);

		if (!::GetMenuItemInfo (hMenu, i, TRUE, &amp;mii))
			continue;

		// GetLastError() ist hier 0 - kein Fehler also
		// Problem: mii.cch ist 0 und cBuffer1 wurde nicht geändert

		if (mii.fType &amp; MF_SEPARATOR || !mii.cch || mii.wID &lt; 60000 || mii.wID &gt; 69999)
			continue;

		::MessageBox (0, cBuffer1, 0, 0); // nie erreicht
	}
}
</code></pre>
<p>Wer kann helfen?</p>
<p>Grüße,<br />
Neku</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/143796/getmenuiteminfo-liefert-string-von-items-nicht</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 10:53:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/143796.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Apr 2006 20:21:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Tue, 11 Apr 2006 20:21:23 GMT]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Ich versuche das Menü einer fremden Anwendung auszulesen (genauer: ICQ Statusauswahl). Jedoch gibt GetMenuItemInfo nicht den Text der Menüeinträge zurück:</p>
<pre><code class="language-cpp">HMENU hMenu = (HMENU)::SendMessage (hWnd, MN_GETHMENU, 0, 0); // hWnd stimmt, hMenu stimmt
if (IsMenu (hMenu))
{
	MENUITEMINFO mii;
	mii.cbSize = sizeof (mii);
	mii.fMask = MIIM_STRING;

	UINT iCount = ::GetMenuItemCount (hMenu);

	for (UINT i = 0; i &lt; iCount; i++)
	{
		mii.dwTypeData = cBuffer1;  // TCHAR cBuffer1[4096]
		mii.cch = sizeof (cBuffer1) / sizeof (TCHAR);

		if (!::GetMenuItemInfo (hMenu, i, TRUE, &amp;mii))
			continue;

		// GetLastError() ist hier 0 - kein Fehler also
		// Problem: mii.cch ist 0 und cBuffer1 wurde nicht geändert

		if (mii.fType &amp; MF_SEPARATOR || !mii.cch || mii.wID &lt; 60000 || mii.wID &gt; 69999)
			continue;

		::MessageBox (0, cBuffer1, 0, 0); // nie erreicht
	}
}
</code></pre>
<p>Wer kann helfen?</p>
<p>Grüße,<br />
Neku</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1035522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1035522</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Tue, 11 Apr 2006 20:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Wed, 12 Apr 2006 22:13:28 GMT]]></title><description><![CDATA[<p>Sollte niemand eine Antwort wissen, wäre ich auch für andere Ideen offen, mit denen ich einen bestimmten Custom-Status in ICQ von einem anderen Programm aus aktivieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036380</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Wed, 12 Apr 2006 22:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 03:05:04 GMT]]></title><description><![CDATA[<p>Um mii.wID auszulesen, muss auch das Flag MIIM_ID gesetzt werden, also:</p>
<p>mii.fMask = MIIM_STRING | MIIM_ID;</p>
<p>Nebenbei: Um Probleme mit GetMenuItemInfo() (&quot;unerklärliches&quot; Versagen, bisweilen sogar Access Violation) zu vermeiden, emfiehlt es sich, alle sonstigen mii-Strukturmitglieder stets auf 0 zu setzen, am besten in jedem Schleifendurchlauf.</p>
<p>Denn beim Abarbeiten von mii überschreibt GetMenuItemInfo() intern unter Umständen einige der Strukturmitglieder - und versagt dann im nächsten Schleifendurchlauf, obwohl die Anwendung von sich aus eigentlich nichts an den Werten geändert hat. Zudem unterscheidet sich dieses schwierig vorhersagbare Verhalten auch noch zwischen den 9x- und den NT-basierten Windows-Versionen.</p>
<p>Die Mehrzahl der WinAPI-Funktionen verhält sich in dieser Hinsicht wohl zuverlässiger, zum Beispiel indem von einer per Zeiger übergebenen Struktur zunächst eine Kopie angelegt wird, mit der dann intern weitergearbeitet wird, oder indem die Werte auf Kernel-Objekte abgebildet werden, bevor etwas geändert wird.</p>
<p>Walter Zorn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036415</guid><dc:creator><![CDATA[Walter Z]]></dc:creator><pubDate>Thu, 13 Apr 2006 03:05:04 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 10:45:19 GMT]]></title><description><![CDATA[<p>Walter Z schrieb:</p>
<blockquote>
<p>Um mii.wID auszulesen, muss auch das Flag MIIM_ID gesetzt werden, also:</p>
<p>mii.fMask = MIIM_STRING | MIIM_ID;</p>
</blockquote>
<p>ach, das hatte ich testweise rausgenommen, danke für die Info ^^</p>
<p>Walter Z schrieb:</p>
<blockquote>
<p>Nebenbei: Um Probleme mit GetMenuItemInfo() (&quot;unerklärliches&quot; Versagen, bisweilen sogar Access Violation) zu vermeiden, emfiehlt es sich, alle sonstigen mii-Strukturmitglieder stets auf 0 zu setzen, am besten in jedem Schleifendurchlauf.</p>
<p>Denn beim Abarbeiten von mii überschreibt GetMenuItemInfo() intern unter Umständen einige der Strukturmitglieder - und versagt dann im nächsten Schleifendurchlauf, obwohl die Anwendung von sich aus eigentlich nichts an den Werten geändert hat. Zudem unterscheidet sich dieses schwierig vorhersagbare Verhalten auch noch zwischen den 9x- und den NT-basierten Windows-Versionen.</p>
</blockquote>
<p>Habe nun mit memset alles auf 0 initialisiert, aber leider funktioniert es dennoch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036632</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Thu, 13 Apr 2006 10:45:19 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 14:20:09 GMT]]></title><description><![CDATA[<p>Bei mir funktioniert der Code, sofern:</p>
<p>a) die Abbruchbedingung mii.wID &lt; 60000 || mii.wID &gt; 69999 so wirklich stimmt,<br />
b) die Größe von cBuffer1 richtig initialisiert bzw. definiert wurde.</p>
<p>Allerdings habe ich den Code nur in einer Nicht-Unicode-Anwendung (mit UCHAR statt WCHAR) getestet.</p>
<p>Versagt denn GetMenuString() ebenfalls?</p>
<p>Walter Zorn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036875</guid><dc:creator><![CDATA[Walter Z]]></dc:creator><pubDate>Thu, 13 Apr 2006 14:20:09 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 14:43:47 GMT]]></title><description><![CDATA[<p>Walter Z schrieb:</p>
<blockquote>
<p>Bei mir funktioniert der Code, sofern:</p>
<p>a) die Abbruchbedingung mii.wID &lt; 60000 || mii.wID &gt; 69999 so wirklich stimmt,<br />
b) die Größe von cBuffer1 richtig initialisiert bzw. definiert wurde.</p>
<p>Allerdings habe ich den Code nur in einer Nicht-Unicode-Anwendung (mit UCHAR statt WCHAR) getestet.</p>
<p>Versagt denn GetMenuString() ebenfalls?</p>
<p>Walter Zorn</p>
</blockquote>
<p>a) hat mit dem Problem ja nichts zu tun.<br />
b) selbst wenn ich dwTypeData und cch auf 0 setze funktioniert es nicht wie es soll</p>
<p>GetMenuString() funktioniert ebenfalls nicht.</p>
<p>Hast du das mit einem (am besten dynamisch erzeugten) Menü eines anderen Programms getestet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036886</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Thu, 13 Apr 2006 14:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 16:04:24 GMT]]></title><description><![CDATA[<blockquote>
<p>Hast du das mit einem (am besten dynamisch erzeugten) Menü eines anderen Programms getestet?</p>
</blockquote>
<p>Ja, mit einem dynamisch erzeugten Menu in einem anderen Programm (nicht einer anderen Instanz des selben Programms).</p>
<p>Allerdings liefert MN_GETHMENU bei mir auch auf XP NULL zurück, weshalb ich auf GetMenu() zurückgegriffen habe.</p>
<p>Hier sicherheitshalber nochmal der getestete Code. (AlertMain (Wrapper für MessageBox) und GetLastErrorString sind anwendungseigene Funktionen.)</p>
<pre><code>#ifndef MN_GETHMENU
    #define MN_GETHMENU 0x01E1
#endif
    HWND hWnd2;
    HMENU hMenu;

    hWnd2 = FindWindow(&quot;MDIMAINWZMdi0.1.0.0&quot;, NULL);
    if(hWnd2 == NULL)
        AlertMain(&quot;hWnd2 ist NULL&quot;);

    else
    {
        //hMenu = (HMENU)SendMessage (hWnd2, MN_GETHMENU, 0, 0); // hWnd2 stimmt, hMenu stimmt
        hMenu = GetMenu (hWnd2); // hWnd2 stimmt, hMenu stimmt

        if(hMenu == NULL)
            AlertMain(&quot;hMenu ist NULL&quot;);

        else if(!IsMenu(hMenu))
            AlertMain(&quot;hMenu kein Menu&quot;);

        else
        {
            UCHAR cBuffer1[4096];
            UINT iCount, i;
            MENUITEMINFO mii;

            iCount = GetMenuItemCount (hMenu);

            for (i = 0; i &lt; iCount; i++)
            {
                memset(&amp;mii, 0, sizeof(mii));
                mii.cbSize = sizeof(mii);
                mii.fMask = MIIM_STRING | MIIM_ID;
                mii.dwTypeData = cBuffer1;  // TCHAR cBuffer1[4096]
                mii.cch = sizeof(cBuffer1) / sizeof(UCHAR);

                if (!GetMenuItemInfo (hMenu, i, TRUE, &amp;mii))
                {
                    if(GetLastErrorString(cBuffer1, sizeof(cBuffer1)-1))
                        AlertMain(cBuffer1);
                    else
                        AlertMain(&quot;GetMenuItemInfo() und GetLastErrorString() fehlgeschlagen&quot;);
                    continue;
                }

                // GetLastError() ist hier 0 - kein Fehler also
                // Problem: mii.cch ist 0 und cBuffer1 wurde nicht geändert

                if (mii.fType &amp; MF_SEPARATOR || !mii.cch
                /* || mii.wID &lt; 60000 || mii.wID &gt; 69999 */
                 )
                    continue;

                MessageBox (0, cBuffer1, 0, 0); // nie erreicht
            }
        }
    }
</code></pre>
<p>Walter Zorn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036958</guid><dc:creator><![CDATA[Walter Z]]></dc:creator><pubDate>Thu, 13 Apr 2006 16:04:24 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 16:13:47 GMT]]></title><description><![CDATA[<p>Hast du zufällig ICQ und könntest es damit probieren? Vielleicht haben die die MFC-Menüklasse überladen und die Strings sind wirklich leer?<br />
Dann müsste ich mich ja von meinem Prozess in den ICQ-Prozess hacken und aus dem Speicher lesen, was ich suche <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>GetMenu() funktioniert beim ICQ-Fenster gar nicht. Liegt vielleicht daran, dass es ein Popup-Menü ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036961</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Thu, 13 Apr 2006 16:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 17:06:32 GMT]]></title><description><![CDATA[<p>Soweit ich weiß, kommt man sowohl mit GetMenu als auch mit MN_GETHMENU nur an Menus heran, die explizit dem Fenster (per SetMenu) bzw. der Fensterklasse zugewiesen wurden.</p>
<p>Bei Popup-Menus ist das normalerweise nicht der Fall, sie haben lediglich ein bestimmtes Fenster als Parent, an das sie zwar die Menu-Kommandos senden, mit dem sie aber, soweit ich weiß, nicht direkt assoziiert sind (per Zeiger in der windowsinternen Datenstruktur für jedes Fenster).</p>
<p>Ob man mit EnumChildWindows() an Popupmenus eines Fensters herankommt, habe ich nicht ausprobiert, glaube aber eher nicht, dass das funktioniert. Der Name der Menu-Fensterklasse ist übrigens &quot;#32768&quot;, vielleicht hilft das irgendwie weiter - oder das Abfangen von WM_INITMENUPOPUP per Hooking...</p>
<p>Walter Zorn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036986</guid><dc:creator><![CDATA[Walter Z]]></dc:creator><pubDate>Thu, 13 Apr 2006 17:06:32 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 17:06:04 GMT]]></title><description><![CDATA[<p>Walter Z schrieb:</p>
<blockquote>
<p>Der Name der Menu-Fensterklasse ist übrigens &quot;#32768&quot;, vielleicht hilft das irgendwie weiter - oder das Abfangen von WM_INITMENUPOPUP per Hooking...</p>
</blockquote>
<p>Über die Fensterklasse komme ich bereits an das Fenster des Popup-Menüs, an das ich MN_GETHMENU sende, um den HMENU zu erhalten. Die anderen Daten, die GetMenuItemInfo liefert, sind ja auch korrekt, nur die Strings eben falsch bzw. leer <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036991</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Thu, 13 Apr 2006 17:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 17:12:55 GMT]]></title><description><![CDATA[<p>Kann es sein, dass es sich um ein Ownerdraw-Menu handelt? Dann sollten die Flags<br />
MIIM_DATA | MIIM_STATE | MIIM_TYPE<br />
für mii.fMask<br />
und die Verwendung von mii.dwItemData statt mii.dwTypeData weiterhelfen.</p>
<p>Problematisch wird's halt nur, wenn dwItemData auf eine Struktur mit Unterelementen statt direkt auf einen String zeigt...</p>
<p>Walter Zorn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1036996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1036996</guid><dc:creator><![CDATA[Walter Z]]></dc:creator><pubDate>Thu, 13 Apr 2006 17:12:55 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 18:10:01 GMT]]></title><description><![CDATA[<p>dwItemData wollte ich zuerst verwenden. Allerdings zeigt der Pointer ja auf einen Speicherbereich von ICQ.</p>
<p>Ich muss mir mal anschauen was OwnerDraw-Menüs sind und wie ich auf den Speicher fremder Programme direkt zugreife.<br />
Danke so weit für deine Hilfe. Falls dir noch etwas einfällt - immer her damit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1037043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1037043</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Thu, 13 Apr 2006 18:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 19:13:47 GMT]]></title><description><![CDATA[<blockquote>
<p>Allerdings zeigt der Pointer ja auf einen Speicherbereich von ICQ.</p>
</blockquote>
<p>Ups, stimmt eigentlich.</p>
<blockquote>
<p>und wie ich auf den Speicher fremder Programme direkt zugreife</p>
</blockquote>
<p>GetWindowThreadProcessId(),<br />
OpenProcess(),<br />
ReadProcessMemory()</p>
<p>und dann den geschriebenen Puffer auf einen plausiblen Menustring validieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Walter Zorn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1037107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1037107</guid><dc:creator><![CDATA[Walter Z]]></dc:creator><pubDate>Thu, 13 Apr 2006 19:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to GetMenuItemInfo liefert String von Items nicht on Thu, 13 Apr 2006 19:43:05 GMT]]></title><description><![CDATA[<p>Yeah, per dwItemData und ReadProcessMemory komme ich an die IDs, die ich brauche <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Danke vielmals für deine Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1037125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1037125</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Thu, 13 Apr 2006 19:43:05 GMT</pubDate></item></channel></rss>