 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 17.04.2012, 21:27 Titel: consolen fenster in systray verschwinden lassen |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 17.04.2012, 23:21 Titel: |
|
|
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 |
|
 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 18.04.2012, 00:25 Titel: |
|
|
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 ...  |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 18.04.2012, 00:29 Titel: |
|
|
Anstatt dem von 28398 vorgeschlagenen Code würde ich zum ermitteln des Window Handles deines Konsolenfensters am Besten die Funktion GetConsoleWindow() verwenden
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 |
|
 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 18.04.2012, 00:59 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 18.04.2012, 15:49 Titel: |
|
|
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 |
|
 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 18.04.2012, 16:38 Titel: |
|
|
naja mein gesamtes bisheriges projekt läuft auf der console da es ein cmd clon ist bzw sein wird ... |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 18.04.2012, 22:50 Titel: |
|
|
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 |
|
 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 18.04.2012, 23:37 Titel: |
|
|
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 |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 20.04.2012, 08:26 Titel: |
|
|
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 ) _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 20.04.2012, 23:52 Titel: |
|
|
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  |
|
Nach oben |
|
 |
|
|
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.
|
|