<?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[Wie zögere ich WM_DESTROY heraus?]]></title><description><![CDATA[<p>Hi</p>
<p>Ich habe eine dll geschrieben in der ich mit SetWindosHookEx WH_CBT hooke um auf das Schließen eines bestimmten Fensters reagieren zu können.<br />
Wenn dieses Fenster dabei ist geschlossen zu werden muss ich ein paar Operationen ausführen bevor es geschlossen wird.</p>
<pre><code class="language-cpp">//Meine DLL
#include &lt;vcl.h&gt;
#include &lt;windows.h&gt;
#pragma hdrstop
//---------------------------------------------------------------------------
HHOOK ghhookKB;
HINSTANCE ghInst;
#pragma argsused

#include &quot;Operationen.cpp&quot;

//---------------------------------------------------------------------------

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
 ghInst = hinstDLL;
 return 1;
}
//---------------------------------------------------------------------------

extern &quot;C&quot; __declspec(dllexport) __stdcall void SetHook(void);
extern &quot;C&quot; __declspec(dllexport) __stdcall void RemoveHook(void);
extern &quot;C&quot; __declspec(dllexport) __stdcall DWORD CheckMes(int, WORD,LONG);
//---------------------------------------------------------------------------

void __stdcall SetHook(void)
{
  HOOKPROC lpfnHookProc = NULL;
  lpfnHookProc = GetProcAddress(GetModuleHandle(&quot;WndHook.dll&quot;),&quot;CheckMes&quot;);
  ghhookKB = SetWindowsHookEx(WH_CBT, lpfnHookProc, ghInst, NULL);
}
//---------------------------------------------------------------------------

void __stdcall RemoveHook(void)
{ UnhookWindowsHookEx(ghhookKB); }
//---------------------------------------------------------------------------

DWORD __stdcall CheckMes(int nCode, WORD wParam, LONG lParam)
{
  const int size=100;
  char ctype[size];

  RealGetWindowClass((HWND)wParam,ctype,size);

 if((strcmpi(ctype,&quot;WindowClass&quot;)!=0) || (nCode &lt; 0))
   return CallNextHookEx(ghhookKB, nCode, wParam, lParam);

  if(nCode==HCBT_DESTROYWND) Operationen();

  return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
}
</code></pre>
<p>Das hat zunächst auch ganz gut geklappt. Allerdings sind einige neue Operationen hinzugekommen und jetzt habe ich das Problem, dass zwar alle korrekt abgearbeitet werden aber wohl zu langsam.<br />
Das Fenster wird geschlossen bevor alle Operationen durch sind.<br />
Jetzt bin ich am überlegen wie man das ändern könnte. Ich habe schon versucht meinen Code zu optimieren aber damit komme ich nicht mehr weiter.<br />
Am besten wäre es glaube ich mit PeekMessage die WM_DESTROY Message aus der Queue zu löschen und nach der Abarbeitung wieder zu posten.<br />
Allerdings sind bis jetzt alle meine Versuche gescheitert.</p>
<p>Hat vielleicht einer eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/161573/wie-zögere-ich-wm_destroy-heraus</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 10:36:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/161573.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Oct 2006 11:25:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie zögere ich WM_DESTROY heraus? on Sun, 08 Oct 2006 11:25:12 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Ich habe eine dll geschrieben in der ich mit SetWindosHookEx WH_CBT hooke um auf das Schließen eines bestimmten Fensters reagieren zu können.<br />
Wenn dieses Fenster dabei ist geschlossen zu werden muss ich ein paar Operationen ausführen bevor es geschlossen wird.</p>
<pre><code class="language-cpp">//Meine DLL
#include &lt;vcl.h&gt;
#include &lt;windows.h&gt;
#pragma hdrstop
//---------------------------------------------------------------------------
HHOOK ghhookKB;
HINSTANCE ghInst;
#pragma argsused

#include &quot;Operationen.cpp&quot;

//---------------------------------------------------------------------------

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
 ghInst = hinstDLL;
 return 1;
}
//---------------------------------------------------------------------------

extern &quot;C&quot; __declspec(dllexport) __stdcall void SetHook(void);
extern &quot;C&quot; __declspec(dllexport) __stdcall void RemoveHook(void);
extern &quot;C&quot; __declspec(dllexport) __stdcall DWORD CheckMes(int, WORD,LONG);
//---------------------------------------------------------------------------

void __stdcall SetHook(void)
{
  HOOKPROC lpfnHookProc = NULL;
  lpfnHookProc = GetProcAddress(GetModuleHandle(&quot;WndHook.dll&quot;),&quot;CheckMes&quot;);
  ghhookKB = SetWindowsHookEx(WH_CBT, lpfnHookProc, ghInst, NULL);
}
//---------------------------------------------------------------------------

void __stdcall RemoveHook(void)
{ UnhookWindowsHookEx(ghhookKB); }
//---------------------------------------------------------------------------

DWORD __stdcall CheckMes(int nCode, WORD wParam, LONG lParam)
{
  const int size=100;
  char ctype[size];

  RealGetWindowClass((HWND)wParam,ctype,size);

 if((strcmpi(ctype,&quot;WindowClass&quot;)!=0) || (nCode &lt; 0))
   return CallNextHookEx(ghhookKB, nCode, wParam, lParam);

  if(nCode==HCBT_DESTROYWND) Operationen();

  return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
}
</code></pre>
<p>Das hat zunächst auch ganz gut geklappt. Allerdings sind einige neue Operationen hinzugekommen und jetzt habe ich das Problem, dass zwar alle korrekt abgearbeitet werden aber wohl zu langsam.<br />
Das Fenster wird geschlossen bevor alle Operationen durch sind.<br />
Jetzt bin ich am überlegen wie man das ändern könnte. Ich habe schon versucht meinen Code zu optimieren aber damit komme ich nicht mehr weiter.<br />
Am besten wäre es glaube ich mit PeekMessage die WM_DESTROY Message aus der Queue zu löschen und nach der Abarbeitung wieder zu posten.<br />
Allerdings sind bis jetzt alle meine Versuche gescheitert.</p>
<p>Hat vielleicht einer eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151382</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Sun, 08 Oct 2006 11:25:12 GMT</pubDate></item></channel></rss>