Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

consolen fenster in systray verschwinden lassen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 17.04.2012, 21:27    Titel: consolen fenster in systray verschwinden lassen Antworten mit Zitat

Hallöchen liebe leut, ich hab mal wieder ne kleine frage und zwar .. möchte ich wie der topic titel hoffentlich vermuten lässt ein stink normalse consolen fenster im textmodus in den systray verschwinden lassen, sollte der anwender es vorher minimieren .. mein problem ist dabei dass ich es zwar hinbekomme ein fenster mit ScreenRes 640,480,32 dazu bewege genau das zu tun nehme ich aber nun screenres raus und versuche es ohne screen anweisung .. geht es nicht .. folgenden code habe ich bisher dafür benutzt:

Code:
    #define WIN_INCLUDEALL
    #include "windows.bi"
    #include "fbgfx.bi"

    #define WM_SHELLNOTIFY WM_USER + 1

    Declare Function NewWindowProc(As HWND,As Uinteger,wParam As WPARAM,lParam As LPARAM) As LRESULT


    Dim As HWND hWin
    Dim Shared As WNDPROC OldWindowProc

    ScreenRes 640,480,32
    WindowTitle "xdos"
    ScreenControl FB.GET_WINDOW_HANDLE,cast(Integer,hWin)
    OldWindowProc = cptr(WNDPROC,SetWindowLong(hWin,GWL_WNDPROC,cast(DWORD,@NewWindowProc)))

    ' Set up our notify icon
    Dim Shared As NOTIFYICONDATA NID
    With NID
    .cbSize = SizeOf (NOTIFYICONDATA)
    .hWnd = hWin
    .hIcon = LoadIcon (NULL, IDI_QUESTION)
    .uFlags = NIF_INFO Or NIF_MESSAGE Or NIF_TIP Or NIF_ICON
    .uCallbackMessage = WM_SHELLNOTIFY
    .szTip = "hallo"
    .szInfoTitle = "nochmal hallo"
    .szInfo = "test 123.."
    End With
sleep

    Function NewWindowProc(Byval hWin As HWND, _
    Byval Msg As Uinteger, _
    Byval wParam As WPARAM, _
    Byval lParam As LPARAM) As LRESULT
    Dim As RECT rcWindow,rcTray
    Dim As HWND hWndTaskBar,hWndTray

    Select Case As Const Msg
    Case WM_SYSCOMMAND
    If wParam = SC_MINIMIZE Then
    ' Get the system tray's hWnd
    hWndTaskBar = FindWindow("Shell_TrayWnd", NULL)
    hWndTray = FindWindowEx(hWndTaskBar, 0, "TrayNotifyWnd", NULL)
    ' Show the notify icon
    Shell_NotifyIcon (NIM_ADD, @NID)
    ' Animate the window closing to the tray
    GetWindowRect hWin, @rcWindow
    GetWindowRect hwndTray, @rcTray
    DrawAnimatedRects hWin, IDANI_CAPTION, @rcWindow, @rcTray

    ' Hide the window
    ShowWindow(hWin, SW_HIDE)
    Return False
    End If
    Case WM_SHELLNOTIFY
    If lParam = WM_LBUTTONDBLCLK Then
    ' Restore the window
    ShowWindow (hWin, SW_SHOWMINIMIZED)
    SendMessage(hWin, WM_SYSCOMMAND, SC_RESTORE,0)
    Shell_NotifyIcon(NIM_DELETE,@NID)
    End If
    End Select

    Return OldWindowProc(hWin, Msg, wParam, lParam)
    End Function


danke für jede hilfe im vorraus
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 17.04.2012, 23:21    Titel: Antworten mit Zitat

Is klar ne, ohne fbgfx hat GET_WINDOW_HANDLE auch keinen Wert.
Du suchst daher das hier < http://support.microsoft.com/kb/124103/en-us >

tl;dr: GetWindowTitle und FindWindow benutzen.

(<1min)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 18.04.2012, 00:25    Titel: Antworten mit Zitat

naja ich hab da jetzt mal einbischen herumprobiert aber klappen wills wohl nicht hab da ..einfach nich den plan wie und wo ich da nun getwindowtitle bzw getconsoletitle einzusetzen hab ...das is nämlich mehr oder minder so dass ich mit diesem programm meine ersten schritte wenn man so will mit der winapi machen möchte ..anscheinend bin ich aber noch zu überfordert ... verlegen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 18.04.2012, 00:29    Titel: Antworten mit Zitat

Anstatt dem von 28398 vorgeschlagenen Code würde ich zum ermitteln des Window Handles deines Konsolenfensters am Besten die Funktion GetConsoleWindow() verwenden zwinkern

Dein Vorhaben ist aber dennoch schon von vornherein zum scheitern verurteilt, und zwar aus folgendem Grund: Obwohl Sie vielleicht so aussehen - Konsolenfenster sind eben keine "normalen" Fenster. Du kannst diese nicht Subclassen, keine Message Hooks installieren, usw. usf.

Wenn du die Rückgabewerte der Funktionen beachtet hättest, würdest du sehen, dass SetWindowLong beim Konsolenfenster immer 0 zurück gibt. Mittels GetLastError kannst du des weiteren den Grund ermitteln: ERROR_ACCESS_DENIED (0x5). (Es hilft übrigens auch nicht das Programm etwa als Administrator zu starten, falls du gerade solche Gedankem im Kopf hattest).

Das System-Konsolenfenster kannst du also nicht (oder nur umständlich - gibt sicher auch irgendwelche Tricks; frag mich aber nicht wie) in den Tray minimieren. Wenn du das unbedingt haben möchtest wäre es ws einfacher ein eigenes Konsolenfenster zu implementieren.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 18.04.2012, 00:59    Titel: Antworten mit Zitat

heisst das jetzt im klartext das ich ein einfache "wie heisst du:" ...dann der input etc etc .. der ja in der "normalen" console abläuft . nicht in das systray bekomme ? (das mit dem input und so is nur ein beispiel, weiß halt nich wie ich's sonst ausdrücken sollte)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 18.04.2012, 15:49    Titel: Antworten mit Zitat

Wenn ich St_W richtig verstehe, scheint es genau das zu heißen. Gibt es denn einen speziellen Grund, warum es unbedingt die Konsole sein muss? Dein "Wie heißt du:"+input läuft ja genauso gut in einem Grafikfenster. Der einzige gute Grund, der mir für ein Konsolenprogramm einfällt, ist der, das Programm auch von der Konsole aus zu starten - und dann ergibt das nachträgliche Setzen der Konsole in den Systray für mich keinen so rechten Sinn.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 18.04.2012, 16:38    Titel: Antworten mit Zitat

naja mein gesamtes bisheriges projekt läuft auf der console da es ein cmd clon ist bzw sein wird ...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 18.04.2012, 22:50    Titel: Antworten mit Zitat

hitori04 hat Folgendes geschrieben:
heisst das jetzt im klartext das ich ein einfache "wie heisst du:" ...dann der input etc etc .. der ja in der "normalen" console abläuft . nicht in das systray bekomme ? (das mit dem input und so is nur ein beispiel, weiß halt nich wie ich's sonst ausdrücken sollte)

Jein, jedenfalls nicht auf die Art und Weise, wie du es mit dem obigen Code versuchst.
Das hat übrigens nichts mit FreeBasic oder dem Text den du ausgibst zu tun, sondern allein mit dem Konsolenfenster von Windows, das Subclassing (was du versuchst) eben nicht zulässt. Dies betrifft übrigens auch das Konsolenfenster der PowerShell (gerade eben ausprobiert).

"Subclassing" bezeichnet übrigens die Methode, mit der du einem Fenster eine neue WndProc zuweist, welche das Verhalten des Fensters entsprechend beeinflussen kann und schlussendlich die Kontrolle wieder an die ursprüngliche WndProc weitergibt. Also genau das, was du im obigen Code mit SetWindowLong versuchst und eben bei Konsolenfenstern nicht möglich ist.

Es ist übrigens problemlos möglich ist ein Konsolenfenster in den Tray zu minimieren:
Code:
#define WIN_INCLUDEALL
#Include "windows.bi"

#define WM_SHELLNOTIFY WM_USER + 1

Dim Shared As HWND hWin
hWin = GetConsoleWindow()

' Set up our notify icon
Dim Shared As NOTIFYICONDATA NID
With NID
   .cbSize = SizeOf (NOTIFYICONDATA)
   .hWnd = hWin
   .hIcon = LoadIcon (NULL, IDI_QUESTION)
   .uFlags = NIF_INFO Or NIF_MESSAGE Or NIF_TIP Or NIF_ICON
   .uCallbackMessage = WM_SHELLNOTIFY
   .szTip = "hallo"
   .szInfoTitle = "nochmal hallo"
   .szInfo = "test 123.."
End With

Sub Hide()
   Dim As RECT rcWindow,rcTray
   Dim As HWND hWndTaskBar,hWndTray
   ' Get the system tray's hWnd
   hWndTaskBar = FindWindow("Shell_TrayWnd", NULL)
   hWndTray = FindWindowEx(hWndTaskBar, 0, "TrayNotifyWnd", NULL)
   ' Show the notify icon
   Shell_NotifyIcon (NIM_ADD, @NID)
   ' Animate the window closing to the tray
   GetWindowRect hWin, @rcWindow
   GetWindowRect hwndTray, @rcTray
   DrawAnimatedRects hWin, IDANI_CAPTION, @rcWindow, @rcTray

   ' Hide the window
   ShowWindow(hWin, SW_HIDE)
End Sub

Sub show()
   ShowWindow (hWin, SW_SHOWMINIMIZED)
   SendMessage(hWin, WM_SYSCOMMAND, SC_RESTORE,0)
   Shell_NotifyIcon(NIM_DELETE,@NID)
End Sub

Print "hiding in 2 sec"
Sleep 2000
Print "hide"
Hide()
Sleep 2000
Print "show"
show()
Print "press any key to exit"
Sleep


Das einzige Problem ist das "Abfangen" des Klicks auf den Minimieren-Button; das du via Subclassing versuchst.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 18.04.2012, 23:37    Titel: Antworten mit Zitat

Vielen dank, für den code und auch für die restlichen antworten ich werde mich dann jetzt erstmal mit dem code von dir beschäftigen vielleicht lässt sich ja auch so schon mein "problem" lösen, also danke nochmals
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 20.04.2012, 08:26    Titel: Antworten mit Zitat

Das sind nur Ausschnitte aus deinem obigen Code. Wie gesagt, auf Subclassing musst du halt verzichten.

Wie du das Minimieren des Fensters feststellst, weiß ich auch aktuell nicht, ob und wie das möglich ist, weil eben beide Varianten mit denen man sowas im Normalfall machen könnte, Subclassing und Message Hooks, bei Konsolenfenstern nicht möglich sind.

Wenn du aber WinAPI lern willst, wär es evt. empfehlenswert mal inzwischen was andres zu machen, bevor du lange an diesem Problem hängen bleibst .. zumal das ein doch eher häufiges Problem ist (Google zufolge zwinkern )
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 20.04.2012, 23:52    Titel: Antworten mit Zitat

da wirst du wohl recht haben, ..naja ich denke ich versuch mich dann erstmal an sagen wir "einfachere", zwar ist es schade dass es nun nicht so funktioniert aber sofern ich mich in die api etwas eingearbeitet, werde ich mich nochmal mit dem problem beschäftigen

ach ja danke nochmals zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz