<?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[Hook soll text in edit-control bestimmen]]></title><description><![CDATA[<p>Hi,<br />
ich wage mich gerade wieder mal an Hooks und möchte dazu ein Programm schreiben, welches in einem Textfenster alle Classnames von Fenstern auflistet die seit Programmstart neu erstellt wurden (von allen laufenden prozessen, nicht nur das eigene Programm). Dazu setze ich in einer DLL einen CBT-Hook und möchte dann daraus mit SendMessage und WM_SETTEXT den Classname eines neu erstellten Fensters in das Textfenster schreiben. Das schaut in der DLL bisher bei mir so aus:</p>
<pre><code class="language-cpp">[...]

HWND mainwnd;

LRESULT CALLBACK CBTProc(int nCode,W PARAM wParam, LPARAM lParam)
{
        if(nCode==HCBT_CREATEWND)
        {
                                    LPCTSTR WndClassName;
                                    WndClassName = ((CBT_CREATEWND*)lParam)-&gt;lpcs-&gt;lpszClass;
                                    SendMessage(mainwnd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)WndClassName);
        }
        if(nCode&lt;0)
        {
                   return CallNextHookEx(hook, nCode, wParam, lParam);
        }
        return 0;
}
DLLIMPORT BOOL SetHook(HWND hwnd)
{
          mainwnd = hwnd;
          hook = SetWindowsHookEx(WH_CBT, CBTProc, hInstance, 0);
          if(hook != NULL)
          {
                  return TRUE;
          }
          return FALSE;
}
</code></pre>
<p>Der SetHook-Funktion wird übrigens natürlich das Handle des Textfensters übergeben. Die DLL funktioniert so jedenfalls und es wird auch registriert wenn neue Fenster erstellt werden (daher weil wenn ich ein Beep in der HookProc einfüge piept mein PC ziemlich wenn ich ein neues Fenster öffne <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ), aber in dem Textfenster in meinem Programm kommt nichts an...? Wenn ich allerdings in meinem Programm nach dem Laden der DLL und des Hooks ein neues Fenster erstell, funktioniert alles so wie es soll, dh. es steht der Classname im Textfenster drin. Deshalb die Frage: Warum wird das Textfenster nicht aktualisiert wenn andere Fenster außerhalb meines Programms geöffnet werden und was kann ich dagegen tun?? Bin für jede Hilfe dankbar!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204248/hook-soll-text-in-edit-control-bestimmen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 20:47:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204248.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 31 Jan 2008 16:13:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hook soll text in edit-control bestimmen on Thu, 31 Jan 2008 16:13:12 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich wage mich gerade wieder mal an Hooks und möchte dazu ein Programm schreiben, welches in einem Textfenster alle Classnames von Fenstern auflistet die seit Programmstart neu erstellt wurden (von allen laufenden prozessen, nicht nur das eigene Programm). Dazu setze ich in einer DLL einen CBT-Hook und möchte dann daraus mit SendMessage und WM_SETTEXT den Classname eines neu erstellten Fensters in das Textfenster schreiben. Das schaut in der DLL bisher bei mir so aus:</p>
<pre><code class="language-cpp">[...]

HWND mainwnd;

LRESULT CALLBACK CBTProc(int nCode,W PARAM wParam, LPARAM lParam)
{
        if(nCode==HCBT_CREATEWND)
        {
                                    LPCTSTR WndClassName;
                                    WndClassName = ((CBT_CREATEWND*)lParam)-&gt;lpcs-&gt;lpszClass;
                                    SendMessage(mainwnd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)WndClassName);
        }
        if(nCode&lt;0)
        {
                   return CallNextHookEx(hook, nCode, wParam, lParam);
        }
        return 0;
}
DLLIMPORT BOOL SetHook(HWND hwnd)
{
          mainwnd = hwnd;
          hook = SetWindowsHookEx(WH_CBT, CBTProc, hInstance, 0);
          if(hook != NULL)
          {
                  return TRUE;
          }
          return FALSE;
}
</code></pre>
<p>Der SetHook-Funktion wird übrigens natürlich das Handle des Textfensters übergeben. Die DLL funktioniert so jedenfalls und es wird auch registriert wenn neue Fenster erstellt werden (daher weil wenn ich ein Beep in der HookProc einfüge piept mein PC ziemlich wenn ich ein neues Fenster öffne <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ), aber in dem Textfenster in meinem Programm kommt nichts an...? Wenn ich allerdings in meinem Programm nach dem Laden der DLL und des Hooks ein neues Fenster erstell, funktioniert alles so wie es soll, dh. es steht der Classname im Textfenster drin. Deshalb die Frage: Warum wird das Textfenster nicht aktualisiert wenn andere Fenster außerhalb meines Programms geöffnet werden und was kann ich dagegen tun?? Bin für jede Hilfe dankbar!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447123</guid><dc:creator><![CDATA[kingofmovies]]></dc:creator><pubDate>Thu, 31 Jan 2008 16:13:12 GMT</pubDate></item><item><title><![CDATA[Reply to Hook soll text in edit-control bestimmen on Thu, 31 Jan 2008 16:41:37 GMT]]></title><description><![CDATA[<p>Ich bin selbst noch Win32-API-N00B, aber traue mich jetzt einfach mal die Frage zu beantworten ... werde langsam mutig! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Also wenn Prozesse die DLL in ihren Speicherbereich laden, existiert logischerweise für jeden Prozess eine eigene <em>HWND mainwnd</em> Variable. Das heißt, die DLL Deines eigenen Prozesses sendet die Message per <em>SendMessage(mainwnd, ...)</em> auch tatsächlich an Dein Fenster, bei allen anderen Instanzen wird <em>mainwnd</em> aber ein undefinierter Wert sein.</p>
<p>Abhilfe:<br />
Du stellst <em>HWND mainwnd</em> in einen SharedMemory-Bereich. Wenn ich mich nicht ganz irre sollte folgendes Dein Problem lösen:</p>
<pre><code class="language-cpp">#pragma data_seg( &quot;SHARDATA&quot;)
HWND mainwnd;
#pragma data_seg()
</code></pre>
<p>Bis denn,<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447147</guid><dc:creator><![CDATA[Black Widow]]></dc:creator><pubDate>Thu, 31 Jan 2008 16:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to Hook soll text in edit-control bestimmen on Thu, 31 Jan 2008 17:09:17 GMT]]></title><description><![CDATA[<p>Vielen Dank für deinen Beitrag, aber deine Idee funktioniert leider nicht. Außerdem verstehe ich nicht wirklich, was du mit &quot;allen anderen Instanzen&quot; meinst, die DLL wird doch nur von meinem Prozess verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447168</guid><dc:creator><![CDATA[kingofmovies]]></dc:creator><pubDate>Thu, 31 Jan 2008 17:09:17 GMT</pubDate></item><item><title><![CDATA[Reply to Hook soll text in edit-control bestimmen on Thu, 31 Jan 2008 18:05:36 GMT]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>naja, Dein Programm ruft vielleicht als einzigstes die SetHook-Funktion auf, aber Windows registriert sie dann für jeden Prozess, für den eine Message von Deinem Hook &quot;gefangen&quot; wird. Hab gerade keinen Link zur Hand, aber such mal bei Google danach falls es Dich interessiert (und das sollte es doch eigentlich, schließlich willst Du das ja programmieren!).</p>
<p>Hab vergessen, die Variablen im shared memory müssen static sein und initialisiert werden. Also probier mal:</p>
<pre><code class="language-cpp">#pragma data_seg(&quot;SHARDATA&quot;)
static HWND mainwnd = 0;
#pragma data_seg()
</code></pre>
<p>Des weiteren fällt mir aber auch gerade auf:<br />
Woher bekommst Du denn eigentlich hInstance? Du musst bei systemweiten Hooks das instance handle der DLL angeben. Das steht aber auch alles in der MSDN (soweit ich weiß auch mit nem Beispiel), also einfach mal da rein schauen und schlau werden.<br />
Außerdem, wird Deine Callbackfunktion überhaupt exportiert?</p>
<p>Gruß,<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1447205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1447205</guid><dc:creator><![CDATA[Black Widow]]></dc:creator><pubDate>Thu, 31 Jan 2008 18:05:36 GMT</pubDate></item></channel></rss>