<?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[Oberflächen-Bedienung eines anderen Programmes unterbinden]]></title><description><![CDATA[<p>Ich entwickle ein Programm, das eine andere Windows-Applikation überwacht. Dabei wird diese Applikation von meinem Programm aus gestartet. Mein Programm bleibt im Hintergrund unsichtbar und meldet sich nur, wenn die überwachte Applikation bestimmte Dateien oder Registry-Einträge erstellt.</p>
<p>Nun möchte ich erreichen, dass wenn mein Programm z.B. eine Meldung anzeigt, die überwachte Applikation nicht mehr per Oberfläche bedient werden kann, also z.B. keine Dialoge mehr weggeklickt werden können, bis ich von meinem Programm aus das wieder freigebe. Ich möchte also auf eine Art dasselbe erreichen, wie man mit ShowModal im eigenen Projekt erreicht - nur auf eine andere Applikation bezogen. Hoffentlich versteht Ihr was ich meine, sonst erklär ich noch nes bissel mehr...</p>
<p>Kann mir jemand sagen, wie ich das erreichen könnte?<br />
- Adrian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/128798/oberflächen-bedienung-eines-anderen-programmes-unterbinden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 20:23:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/128798.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 07 Dec 2005 09:52:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Oberflächen-Bedienung eines anderen Programmes unterbinden on Wed, 07 Dec 2005 09:52:33 GMT]]></title><description><![CDATA[<p>Ich entwickle ein Programm, das eine andere Windows-Applikation überwacht. Dabei wird diese Applikation von meinem Programm aus gestartet. Mein Programm bleibt im Hintergrund unsichtbar und meldet sich nur, wenn die überwachte Applikation bestimmte Dateien oder Registry-Einträge erstellt.</p>
<p>Nun möchte ich erreichen, dass wenn mein Programm z.B. eine Meldung anzeigt, die überwachte Applikation nicht mehr per Oberfläche bedient werden kann, also z.B. keine Dialoge mehr weggeklickt werden können, bis ich von meinem Programm aus das wieder freigebe. Ich möchte also auf eine Art dasselbe erreichen, wie man mit ShowModal im eigenen Projekt erreicht - nur auf eine andere Applikation bezogen. Hoffentlich versteht Ihr was ich meine, sonst erklär ich noch nes bissel mehr...</p>
<p>Kann mir jemand sagen, wie ich das erreichen könnte?<br />
- Adrian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/936441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/936441</guid><dc:creator><![CDATA[ABader]]></dc:creator><pubDate>Wed, 07 Dec 2005 09:52:33 GMT</pubDate></item><item><title><![CDATA[Reply to Oberflächen-Bedienung eines anderen Programmes unterbinden on Wed, 07 Dec 2005 11:12:35 GMT]]></title><description><![CDATA[<p>Hab es nicht probiert aber es gibt zwei Möglichkeiten:<br />
1. Du zeigst einen Dialog an und übergibst als Parent das Window-Handle des anderen Programmes (wird aber vermutlich nicht gehen)<br />
2. Du injizierst einen RemoteThread und zeigst dann den Dialog mit dem passenden Parent-Handle an</p>
]]></description><link>https://www.c-plusplus.net/forum/post/936506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/936506</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Wed, 07 Dec 2005 11:12:35 GMT</pubDate></item><item><title><![CDATA[Reply to Oberflächen-Bedienung eines anderen Programmes unterbinden on Wed, 07 Dec 2005 13:05:55 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Idee! Bei meinen weiteren Recherchen bin ich jetzt aber gerade auf die ultimative API gestossen: EnableWindow(HWND hwnd, bool enabled);<br />
Mit dieser kann man genau das machen, was ich will.</p>
<p>Jetzt muss ich einfach noch die API finden, um von einem Process-Handle das Window-Handle zu erhalten.<br />
- Adrian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/936560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/936560</guid><dc:creator><![CDATA[ABader]]></dc:creator><pubDate>Wed, 07 Dec 2005 13:05:55 GMT</pubDate></item><item><title><![CDATA[Reply to Oberflächen-Bedienung eines anderen Programmes unterbinden on Sat, 10 Dec 2005 08:06:22 GMT]]></title><description><![CDATA[<p>Hier übrigens noch eine fertige Lösung:</p>
<pre><code>EnableAllWindowsOfProcess(AnsiString procExeName, DWORD procID, bool state)
</code></pre>
<p>Wenn man die Process ID weiss, kann man direkt die Process ID übergeben. Andernfalls den Namen des Prozesses (z.B. Project1.exe / explorer.exe)</p>
<p>Dazu der Source:</p>
<pre><code class="language-cpp">int EnableAllWindowsOfProcess(AnsiString procExeName, DWORD procID, bool state)
{
    vector&lt;HWND&gt;    hwnds;
    char            buf[255];

    if (procID == 0) procID = GetProcessIdByName (procExeName);
    hwnds = GetHwndOfProcessID (procID);

    for (unsigned int i = 0; i &lt; hwnds.size(); ++i)
    {
        EnableWindow (hwnds[i], state);
    }

    return hwnds.size();
}
</code></pre>
<pre><code class="language-cpp">DWORD GetProcessIdByName (AnsiString ExeFileName)
{
    bool            ContinueLoop;
    HANDLE          FSnapshotHandle;
    PROCESSENTRY32  FProcessEntry32;
    DWORD           ret                 = 0;

    FSnapshotHandle = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
    FProcessEntry32.dwSize = sizeof(FProcessEntry32);
    ContinueLoop = Process32First(FSnapshotHandle, &amp;FProcessEntry32);

    do
    {
        if ( (ExtractFileName(FProcessEntry32.szExeFile).UpperCase() == ExeFileName.UpperCase() )  ||
             (UpperCase (FProcessEntry32.szExeFile) == ExeFileName.UpperCase()) )
        {
                 ret = FProcessEntry32.th32ProcessID;
        }

        ContinueLoop = Process32Next(FSnapshotHandle, &amp;FProcessEntry32);
    } while (ContinueLoop);

  CloseHandle(FSnapshotHandle);

  return ret;
}
</code></pre>
<pre><code class="language-cpp">BOOL CALLBACK enumWindowsProc(HWND hwnd, LPARAM lParam)
{
    ((vector&lt;HWND&gt; *)lParam)-&gt;push_back (hwnd);
}

vector&lt;HWND&gt; GetHwndOfProcessID (int processID)
{
    HWND            hwnd    = 0;
    DWORD           procID;
    vector&lt;HWND&gt;    hwnds;
    vector&lt;HWND&gt;    appHwnds;

    EnumWindows ((WNDENUMPROC)enumWindowsProc, (long)&amp;hwnds);

    for (unsigned int i = 0; i &lt; hwnds.size(); ++i)
    {
        GetWindowThreadProcessId (hwnds[i], &amp;procID);
        if (procID == processID)
            appHwnds.push_back(hwnds[i]);
    }

    return appHwnds;
}
</code></pre>
<p>Das ganze ist mit BCB kompilierbar und funktioniert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /><br />
- Adrian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/938667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938667</guid><dc:creator><![CDATA[ABader]]></dc:creator><pubDate>Sat, 10 Dec 2005 08:06:22 GMT</pubDate></item></channel></rss>