<?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[OSD-Uhr, Message ohne Window, HotKey und Funktionen]]></title><description><![CDATA[<p>Der Ursprung für diesen Thread stammt von <a href="http://www.c-plusplus.net/forum/viewtopic.php?t=90166" rel="nofollow">diesem Thread</a></p>
<p>Es ging darum HotKey Messages zu verarbeiten ohne ein Window, bzw. ein HWND zu haben.<br />
Um das mal anhand eines Beispiels zu verdeutlichen, habe ich daraus eine OSD-Uhr gemacht.<br />
Für viele kleine Sachen benötigen wir kein Fenster daher verstecken wir es ständig, doch für einige Programme brauchen wir kein Fenster zu verstecken, es reicht aus keins zu erstellen <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="😉"
    /><br />
An dieser Stelle mal ein Dankeschön an (UNREGISTRIERTER)Alt+S, und ein TuckTuck an Windows, für seine schlüssige SDK Doku.</p>
<p>Hier mal der Dokumentierte Code der OSD-Uhr:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#define COUNTELEMENTS(z) (sizeof((z)) / sizeof((z)[0]))

SYSTEMTIME st;     /* Die Systemtime Struct */
TCHAR szTime[32];  /* kennen wir doch, oder? */
RECT toRec;        /* Das kennen wir auch */
HFONT hFont;       /* ein Object Handle für nen Font */

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime); /* Timer Procedure */

/* unsere WinMain, das kennt jeder hier */
int WINAPI WinMain(HINSTANCE hIns, HINSTANCE pIns, LPSTR pSt, int eg) 
{ 
    /* Ein Font Objekt erstellen, göße 24 (keine echten 24pix), Bold, Font:Arial */
    hFont = CreateFont(24,0,0,0,FW_BOLD,0,0,0,0,0,0,0,FIXED_PITCH,&quot;Arial&quot;);
    /* Timer setzten mit unserer Timer Procedure */
    SetTimer(NULL, 0, 200, TimerProc); 
    MSG message; /* unsere Message Struct */
    /* Nun Regestrieren wir Strg+Q als HotKey um damit unser Programm zu beenden */
    RegisterHotKey(NULL, 1000, MOD_CONTROL, 'Q');
    /* Die message Schleife */ 
    while(GetMessage(&amp;message, NULL, 0, 0)) 
    {   
        if (message.message == WM_HOTKEY)
        {
                /* Anzeige bereich zurücksetzten */
                RedrawWindow(NULL,&amp;toRec,NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);
                PostQuitMessage(0);
        }    
        /* DispatchMessage würde nicht benötigt, wenn wir nicht eine TimerProc da wäre */
        /* da wir aber eine TimerProc haben müßen wir die Nachricht weiterleiten an diese */                  
        DispatchMessage(&amp;message); 
    }    
    return message.wParam; 
}

/* nun unsere TimerProc */
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
    /* das TagRect mit Daten Fütern (Bereich der Anzeige) */
    toRec.left = 5;
    toRec.top = 5;
    toRec.right = 200;
    toRec.bottom = 35;
    /* die Uhrzeit holen */
    GetLocalTime (&amp;st);
    /* und in Klartext ins TCHAR schreiben */
    GetTimeFormat (LOCALE_USER_DEFAULT, LOCALE_USE_CP_ACP, &amp;st, NULL, szTime, COUNTELEMENTS(szTime));
    /* Hintergrund neu Aufbauen, damit die Ausgabe sich nicht übermalt */
    RedrawWindow(NULL,&amp;toRec,NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);
    /* Sleep(1) um Windows seine WM_PAINT mesages senden zu lassen, damit der Hintergrund auch neu kommt */
    Sleep(1);
    HDC hdc;
    /* DC des Desktop (das was man sieht) holen */
    hdc = GetDC(NULL);
    /* neuen Font zuordnen (unseren) */
    HGDIOBJ OldObject = SelectObject(hdc,hFont);
    /* Transparent damit die Schrift kein Hintergrund hat */
    SetBkMode(hdc,TRANSPARENT);
    /* so, erst Textfarbe Schwarz als Schatten */
    SetTextColor(hdc,RGB(0,0,0));
    /* und um 3 Pixel verschoben ausgeben (Schatten) */
    TextOut(hdc, toRec.left+3, toRec.top+3, szTime, strlen(szTime));
    /* jetzt Textfarbe Gelb als eigentliche Ausgabe */
    SetTextColor(hdc,RGB(255,255,0));
    /* und an der Orginal Stelle ausgeben */
    TextOut(hdc, toRec.left, toRec.top, szTime, strlen(szTime));
    /* DC wieder freigeben */
    ReleaseDC(NULL,hdc);
    /* hFont Objekt zurücksetzten */
    SelectObject(hdc, OldObject);            
} 

/* Fertisch dat wa dat */
</code></pre>
<p>Das kann man noch zum nen Wecker ausbauen, nur für die eingabe der Weckzeit, muß wieder ein Window oder Dialog her.</p>
<p>Dennoch vertrette ich die Meinung das dies nicht Anwenderfreundlich ist, freundlicher wird es z.B. mit einem TrayIcon und/oder ähnlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/90261/osd-uhr-message-ohne-window-hotkey-und-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Apr 2026 23:32:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/90261.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Oct 2004 22:05:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to OSD-Uhr, Message ohne Window, HotKey und Funktionen on Wed, 27 Oct 2004 22:05:34 GMT]]></title><description><![CDATA[<p>Der Ursprung für diesen Thread stammt von <a href="http://www.c-plusplus.net/forum/viewtopic.php?t=90166" rel="nofollow">diesem Thread</a></p>
<p>Es ging darum HotKey Messages zu verarbeiten ohne ein Window, bzw. ein HWND zu haben.<br />
Um das mal anhand eines Beispiels zu verdeutlichen, habe ich daraus eine OSD-Uhr gemacht.<br />
Für viele kleine Sachen benötigen wir kein Fenster daher verstecken wir es ständig, doch für einige Programme brauchen wir kein Fenster zu verstecken, es reicht aus keins zu erstellen <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="😉"
    /><br />
An dieser Stelle mal ein Dankeschön an (UNREGISTRIERTER)Alt+S, und ein TuckTuck an Windows, für seine schlüssige SDK Doku.</p>
<p>Hier mal der Dokumentierte Code der OSD-Uhr:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#define COUNTELEMENTS(z) (sizeof((z)) / sizeof((z)[0]))

SYSTEMTIME st;     /* Die Systemtime Struct */
TCHAR szTime[32];  /* kennen wir doch, oder? */
RECT toRec;        /* Das kennen wir auch */
HFONT hFont;       /* ein Object Handle für nen Font */

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime); /* Timer Procedure */

/* unsere WinMain, das kennt jeder hier */
int WINAPI WinMain(HINSTANCE hIns, HINSTANCE pIns, LPSTR pSt, int eg) 
{ 
    /* Ein Font Objekt erstellen, göße 24 (keine echten 24pix), Bold, Font:Arial */
    hFont = CreateFont(24,0,0,0,FW_BOLD,0,0,0,0,0,0,0,FIXED_PITCH,&quot;Arial&quot;);
    /* Timer setzten mit unserer Timer Procedure */
    SetTimer(NULL, 0, 200, TimerProc); 
    MSG message; /* unsere Message Struct */
    /* Nun Regestrieren wir Strg+Q als HotKey um damit unser Programm zu beenden */
    RegisterHotKey(NULL, 1000, MOD_CONTROL, 'Q');
    /* Die message Schleife */ 
    while(GetMessage(&amp;message, NULL, 0, 0)) 
    {   
        if (message.message == WM_HOTKEY)
        {
                /* Anzeige bereich zurücksetzten */
                RedrawWindow(NULL,&amp;toRec,NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);
                PostQuitMessage(0);
        }    
        /* DispatchMessage würde nicht benötigt, wenn wir nicht eine TimerProc da wäre */
        /* da wir aber eine TimerProc haben müßen wir die Nachricht weiterleiten an diese */                  
        DispatchMessage(&amp;message); 
    }    
    return message.wParam; 
}

/* nun unsere TimerProc */
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
    /* das TagRect mit Daten Fütern (Bereich der Anzeige) */
    toRec.left = 5;
    toRec.top = 5;
    toRec.right = 200;
    toRec.bottom = 35;
    /* die Uhrzeit holen */
    GetLocalTime (&amp;st);
    /* und in Klartext ins TCHAR schreiben */
    GetTimeFormat (LOCALE_USER_DEFAULT, LOCALE_USE_CP_ACP, &amp;st, NULL, szTime, COUNTELEMENTS(szTime));
    /* Hintergrund neu Aufbauen, damit die Ausgabe sich nicht übermalt */
    RedrawWindow(NULL,&amp;toRec,NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);
    /* Sleep(1) um Windows seine WM_PAINT mesages senden zu lassen, damit der Hintergrund auch neu kommt */
    Sleep(1);
    HDC hdc;
    /* DC des Desktop (das was man sieht) holen */
    hdc = GetDC(NULL);
    /* neuen Font zuordnen (unseren) */
    HGDIOBJ OldObject = SelectObject(hdc,hFont);
    /* Transparent damit die Schrift kein Hintergrund hat */
    SetBkMode(hdc,TRANSPARENT);
    /* so, erst Textfarbe Schwarz als Schatten */
    SetTextColor(hdc,RGB(0,0,0));
    /* und um 3 Pixel verschoben ausgeben (Schatten) */
    TextOut(hdc, toRec.left+3, toRec.top+3, szTime, strlen(szTime));
    /* jetzt Textfarbe Gelb als eigentliche Ausgabe */
    SetTextColor(hdc,RGB(255,255,0));
    /* und an der Orginal Stelle ausgeben */
    TextOut(hdc, toRec.left, toRec.top, szTime, strlen(szTime));
    /* DC wieder freigeben */
    ReleaseDC(NULL,hdc);
    /* hFont Objekt zurücksetzten */
    SelectObject(hdc, OldObject);            
} 

/* Fertisch dat wa dat */
</code></pre>
<p>Das kann man noch zum nen Wecker ausbauen, nur für die eingabe der Weckzeit, muß wieder ein Window oder Dialog her.</p>
<p>Dennoch vertrette ich die Meinung das dies nicht Anwenderfreundlich ist, freundlicher wird es z.B. mit einem TrayIcon und/oder ähnlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/638987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/638987</guid><dc:creator><![CDATA[MiC++ha]]></dc:creator><pubDate>Wed, 27 Oct 2004 22:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to OSD-Uhr, Message ohne Window, HotKey und Funktionen on Wed, 27 Oct 2004 22:16:42 GMT]]></title><description><![CDATA[<p>So ist das doch allerübelst dirty. Das flackert und wenn man mit anderen Fenstern darüber zieht gibt es Grafikfehler.</p>
<p>Also wenn ich sowas machen würde, würde ich ein Fenster mit Regions erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/638991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/638991</guid><dc:creator><![CDATA[region]]></dc:creator><pubDate>Wed, 27 Oct 2004 22:16:42 GMT</pubDate></item><item><title><![CDATA[Reply to OSD-Uhr, Message ohne Window, HotKey und Funktionen on Wed, 27 Oct 2004 22:28:00 GMT]]></title><description><![CDATA[<p>region schrieb:</p>
<blockquote>
<p>So ist das doch allerübelst dirty. Das flackert und wenn man mit anderen Fenstern darüber zieht gibt es Grafikfehler.</p>
<p>Also wenn ich sowas machen würde, würde ich ein Fenster mit Regions erstellen.</p>
</blockquote>
<p>Hmmm, du hast nicht verstanden worum es geht! Es geht nicht um die Anzeige der Uhr, sondern darum kein Fenster zu erstellen, auch keins mit Regionen. Lese mal vom vorgänger Theard die letzten 2 Seiten, dann verstehst du worum es geht.<br />
Das kann man aber auch sauberer bekommen, ich wollte aber als Windowless beispiel den Code begrenzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/638993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/638993</guid><dc:creator><![CDATA[MiC++ha]]></dc:creator><pubDate>Wed, 27 Oct 2004 22:28:00 GMT</pubDate></item><item><title><![CDATA[Reply to OSD-Uhr, Message ohne Window, HotKey und Funktionen on Thu, 28 Oct 2004 08:03:56 GMT]]></title><description><![CDATA[<p>Guten Tag,</p>
<p>kann man auch das Flackern vermeiden, ohne ein Fenster erstellen und/oder benutzen zu müssen? Vielen Dank im Voraus für Antworten, die für einen WinAPI-C-Programmierer hilfreich sind.</p>
<p>Mit freundlichen Grüßen</p>
<p>ein Interessierter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/639163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/639163</guid><dc:creator><![CDATA[Interessierter]]></dc:creator><pubDate>Thu, 28 Oct 2004 08:03:56 GMT</pubDate></item><item><title><![CDATA[Reply to OSD-Uhr, Message ohne Window, HotKey und Funktionen on Thu, 28 Oct 2004 16:17:18 GMT]]></title><description><![CDATA[<p>Evtl. hilft DoubleBuffering <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/639692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/639692</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Thu, 28 Oct 2004 16:17:18 GMT</pubDate></item><item><title><![CDATA[Reply to OSD-Uhr, Message ohne Window, HotKey und Funktionen on Thu, 28 Oct 2004 21:45:41 GMT]]></title><description><![CDATA[<p>flenders schrieb:</p>
<blockquote>
<p>Evtl. hilft DoubleBuffering <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Jain, in der Richtung schon, aber noch etwas eleganter, werde das mal raussuchen<br />
wie ich es bei meinem mediaPlayer habe, aber das sollte jetzt eigentlich<br />
nicht das Thema sein, sondern die Anwender Unfreundlichkeit kein Fenster<br />
zu bieten, oder sonst jeglicher visuelle Hinweis auf das Programm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/639962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/639962</guid><dc:creator><![CDATA[MiC++ha]]></dc:creator><pubDate>Thu, 28 Oct 2004 21:45:41 GMT</pubDate></item></channel></rss>