MessageOnlyWindow



  • Hallo Leute,

    ich möchte gern die Funktion „WSAAsyncSelect“ in in einer Konsolenanwendung verwenden. Unzählige Threads weisen Fragesteller zu dieser Frage auf zahlreiche Alternativen hin. Vermutlich wäre es auch in meinem Fall sinnvoll, über eine Alternative nachzudenken- allerdings glaube ich, mein etwas komlexeres Programmierproblem nur auf diesem Wege lösen zu können.

    Dummerweise akzeptiert die Funktion keinen Zeiger auf ein Callback, sondern will unbedingt ein HWND Window, um dahin mich interessierende Messages zu schicken. Allerdings möchte ich eine Konsolenanwendung ohne Fenster realisieren.

    Ein sogennantes MessageOnlyWindow wäre sicherlich hilfreich. Definitionen für derartige unsichtbare Fenster habe ich unter diesen URL gefunden:

    [url] http://msdn.microsoft.com/de-de/library/windows/desktop/ms740668(v=vs.85).aspx [/url]

    [quote]
    To create a message-only window, supplyHWND_MESSAGE or a handle to an existing message-only window.
    [/quote]

    (NA TOLL ! - und woher soll ich das Fenster nehmen ?)

    [url]
    http://www.codeguru.com/cpp/frameworks/advancedui/windowingtechniquesandclasses/article.php/c12689/Message-Only-Window.htm
    [/url]

    (Mutex kann ich nicht verwenden, da ich keine Ahnung davon habe.)

    [url]
    http://www.codeproject.com/Articles/7969/How-to-make-a-Message-Only-Window
    [/url]

    (MFC Routinen, die irgendetwas mit afx…. zu tun haben, wollte ich nicht verwenden…)

    [url]
    http://stackoverflow.com/questions/16448437/how-to-receive-messages-using-a-message-only-window-in-a-console-application
    [/url]

    (Insbesondere der letzte Hinweis scheint interessant zu sein….)

    Ich stelle mir unter einen WIN32 Message Only Window eine Klasse vor, die so tut als wäre sie ein Window- aber eben ohne Window.

    Kennt jemand einen geeigneten WIN32 Code oder einen Link dorthin ?



  • Hihi.
    Die Sache ist einfacher als du denkst.
    Du erstellst einfach ein unsichtbares top level Fenster (VS_VISIBLE nicht gesetzt).
    => Fertig.

    Bis auf das kleine Detail dass du das Fenster nie anzeigst unterscheidet sich die Sache nicht von einem "normalen" Fenster. Du erstellst es genau so über RegisterClass/CreateWindow(Ex), betreibst einen Message-Pump, und bekommst die Nachrichten über die Window-Proc rein.

    Wenn es Sinn macht kannst du auch einen eigenen Thread verwenden, der das Message Fenster erstellt und den Message-Pump betreibt. Damit du im "Haupt-Thread" nicht aufpassen musst zwischendurch immer wieder nen Message-Pump anzuwerfen. Lässt sich auch wunderbar in eine eigene Klasse kapseln.

    7x7-7 schrieb:

    (Mutex kann ich nicht verwenden, da ich keine Ahnung davon habe.)

    Das klingt nicht gut.
    Dann doch lieber die Finger von eigenen Threads lassen. Nur... was willst du dann mit WSAAsyncSelect? Also in einer Fensteranwendung wäre es klar, aber dann hättest du ja schon ein Fenster, und würdest nicht vor dem Problem " Message-Only-Window" stehen.

    Und letztlich

    7x7-7 schrieb:

    Vermutlich wäre es auch in meinem Fall sinnvoll, über eine Alternative nachzudenken- allerdings glaube ich, mein etwas komlexeres Programmierproblem nur auf diesem Wege lösen zu können.

    Ich bin mir so-gut-wie sicher dass man dein Problem auch anders lösen kann. Ob du es anders lösen kannst weiss ich nicht. Sieht aber so aus als ob du es auch mit WSAAsyncSelect gebacken bekommst.

    Wäre also vielleicht doch schlau mal zu gucken was es sonst noch gibt.
    Und natürlich: vielleicht solltest du nicht nach Details zu einer Technik fragen die deiner Meinung nach ideal sei, sondern mal beschreiben was du überhaupt machen willst, und wie man das angehen könnte.



  • Oh eine Antwort…Danke für den Beitrag.

    ich habe den Ansatz aus dem letzten, der von mir aufgeführten Beispiele aufgegriffen und dieses etwas verändert -> nun wird ein richtiges Geisterfenster erzeugt, das auch Messages empfängt.
    Für andere, die einen Code zum Copy&Paste erwarteten:

    (Das Ganze funktioniert natürlich auch mit WSAAsyncSelect).

    #include <iostream>
    #include <Windows.h>
    
     LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
      {
        if (uMsg == WM_NOTIFY)
          std::cout << "Got a message!" << std::endl;
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
      }
    
    int main()
    {
    
      WNDCLASS windowClass = {};
      windowClass.lpfnWndProc = WndProc; //Pointer auf Callback
      windowClass.lpszClassName = L"Geisterfenster";
    
      if (!RegisterClass(&windowClass)) {
        std::cout << "Failed to register window class" << std::endl;
    	while(true);
        return 1;
      }
    
      HWND messageWindow = CreateWindowEx(0L,windowClass.lpszClassName, 0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0);
      if (!messageWindow) {
        std::cout << "Failed to create message-only window" << std::endl;
        return 1;
      }
    
       std::cout << "Waiting for Messages "<< std::endl;
       MSG msg;
    
      while (PeekMessage (&msg, messageWindow, 0, 0, PM_REMOVE) == 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    
    	SendMessage(messageWindow,WM_NOTIFY,0,0);
    
      } //will never end...
    
      return msg.wParam;
    }
    


  • 7x7-7 schrieb:

    Oh eine Antwort…

    Kommt vor wenn man ne Frage gestellt hat, ja 😕



  • hustbaer hat immer einen unfreundlichen Spruch auf Lager. Einfach unausgeglichen der Typ!


Anmelden zum Antworten