|
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 |
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 13.11.2006, 10:17 Titel: WinAPI:FindWindow/Vordergrund,Symbol in Taskleiste entfernen |
|
|
Hallo,
1.Problem das ich habe ist das FindWindow nicht so funktioniert wie ich mir das vorstelle
Ich will das Handle vom aktuell aktiven Programm bekommen.
Ich bekomme allerdings nur Handles von TOPMOST Programmen.
Code: |
#include once "windows.bi"
dim as HWND hwnd, top.hwnd
dim konsole as string
print "Konsole: "
print "Top Fenster: "
do
konsole=command$(0)
hwnd=FindWindow(0,strptr(konsole))
locate 1,14:print hwnd;space(10)
top.hwnd=FindWindow(0,strptr(""))
locate 2,14:print top.hwnd;space(10)
sleep 100
loop until inkey$=chr$(27)
|
Zitat: |
The FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.
HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
Parameters
lpClassName
Points to a null-terminated string that specifies the class name or is an atom that identifies the class-name string. If this parameter is an atom, it must be a global atom created by a previous call to the GlobalAddAtom function. The atom, a 16-bit value, must be placed in the low-order word of lpClassName; the high-order word must be zero.
lpWindowName
Points to a null-terminated string that specifies the window name (the window’s title). If this parameter is NULL, all window names match.
|
2.Ich habe ein Programm als TOPMOST dauerhaft, sodass andere TOPMOST Programme, wie zb der WMP(wenn man es entsprechen eingestellt hat),trotzdem darunter liegen.
Bloß habe ich jetzt das Problem, dass auch Kontextmenüs unter meinem Programm liegen.Und die möchte ich eigentlich nicht da haben.
Hier der Code:
Code: |
#include once "windows.bi"
'Code aus Sebastians Programm zum ermitteln des aktuellen Traffics
Declare Function GetIfTable Lib "iphlpapi.dll" Alias "GetIfTable" _
(ByRef pIfTable As Any, ByRef pdwSize As Long, ByVal bOrder As _
Long) As Long
DECLARE Function GetName(arr() as ubyte) As String
dim dst as any ptr
dim stc as any ptr
dim bcount as long
Const MAX_INTERFACE_NAME_LEN As Long = 256&
Const MAXLEN_IFDESCR As Long = 256&
Const MAXLEN_PHYSADDR As Long = 8&
Const MIB_IF_TYPE_OTHER As Long = 1&
Const MIB_IF_TYPE_ETHERNET As Long = 6&
Const MIB_IF_TYPE_TOKENRING As Long = 9&
Const MIB_IF_TYPE_FDDI As Long = 15&
Const MIB_IF_TYPE_PPP As Long = 23&
Const MIB_IF_TYPE_LOOPBACK As Long = 24&
Const MIB_IF_TYPE_SLIP As Long = 28&
Type MIB_IFROW
wszName(0 To (MAX_INTERFACE_NAME_LEN - 1) * 2) As UByte
dwIndex As Long
dwType As Long
dwMtu As Long
dwSpeed As Long
dwPhysAddrLen As Long
bPhysAddr(0 To MAXLEN_PHYSADDR - 1) As UByte
dwAdminStatus As Long
dwOperStatus As Long
dwLastChange As Long
dwInOctets As UINTEGER
dwInUcastPkts As Long
dwInNUcastPkts As Long
dwInDiscards As Long
dwInErrors As Long
dwInUnknownProtos As Long
dwOutOctets As UINTEGER
dwOutUcastPkts As Long
dwOutNUcastPkts As Long
dwOutDiscards As Long
dwOutErrors As Long
dwOutQLen As Long
dwDescrLen As Long
bDescr(0 To MAXLEN_IFDESCR - 1) As UByte
End Type
Dim IPInterfaceRow As MIB_IFROW
Dim buff() As uByte
Dim AS LONG cbRequired, nStructSize, nRows, cnt
DIM AS UINTEGER Gesendet, Empfangen
dim t as string, einheit as string
dim title as string
const progname as string = "Traffic"
dim x as integer, y as integer
screeninfo x,y 'liest screeninfo aus um fenster am unteren rechten rand zu positionieren
screenres 180,24,8,1,&h10'320*200: der tolle transparent effekt
color 1,0
line (0,0)-(180,24),rgb(255,0,255),bF 'fenster transparent malen
'Schließenbutton
line (160,0)-(175,17),1,bf
line (160,0)-(175,17),12
line (175,0)-(160,17),12
line (161,0)-(175,16),12
line (174,0)-(160,16),12
'Fenster in die untere rechte Ecke positionieren
title=progname
windowtitle title
dim hwnd as HWND
hwnd=FindWindow(0,strptr(title))
SetWindowPos( hwnd,HWND_TOPMOST, x-181, y-55, 0, 0, _ '20+35(taskleiste)
SWP_NOSIZE OR SWP_SHOWWINDOW or WS_EX_TOOLWINDOW)
locate 1:print chr$(25)'empfangen
locate 1,16:print "kb/s"
locate 1,10:print chr$(176)
locate 2:print chr$(24)'gesendet
locate 2,16:print "kb/s"
locate 2,10:print chr$(176)
einheit="kb"
dim tim as single
tim=timer
'Zum ausrechnen der durchschnittlichen downloadgeschwindigkeit
dim as integer dwl, upl
dim as integer ldwl, lupl
dim as integer mx,my,mbut 'für mausposition
dim firstloop as integer=1 'damit nicht kb/s der gesamte traffic seit pc-start ist
dO
t=inkey$
select case t
case chr$(27):end
case chr$(255)+"k":end
end select
'Beende Programm wenn auf den Schließembutton geklickt wird
getmouse mx,my,,mbut
if mbut and 1 then
select case mx
case 160 to 175:select case my:case 0 to 17:end:end select
end select
end if
'Puffergröße auslesen
Call GetIfTable(ByVal 0&, cbRequired, 1)
If cbRequired > 0 Then
ReDim buff(0 To cbRequired - 1)
If GetIfTable(buff(0), cbRequired, 1) = ERROR_SUCCESS Then
nStructSize = Len(IPInterfaceRow)
'Die Anzahl der Adapter auslesen
CopyMemory @nRows, @buff(0), 4
'Für jeden Adapter...
For cnt = 1 To nRows
'...Informationen in eine Struktur kopieren
CopyMemory @IPInterfaceRow, @buff(4 + (cnt - 1) * _
nStructSize), nStructSize
If IPInterfaceRow.dwType = MIB_IF_TYPE_ETHERNET Then
'Informationen auslesen und anzeigen
Empfangen = FIX(IPInterfaceRow.dwInOctets/1024)
Gesendet = FIX(IPInterfaceRow.dwOutOctets/1024)
if firstloop=1 then
ldwl=empfangen
lupl=gesendet
firstloop=0
end if
dwl+=(empfangen-ldwl)
upl+=(gesendet-lupl)
ldwl=empfangen
lupl=gesendet
if len(str(empfangen)) or len(str(gesendet))>3 then
empfangen=fix(empfangen/1024)
Gesendet=fix(Gesendet/1024)
einheit="mb"
end if
locate 1,7:print einheit
locate 2,7:print einheit
locate 1,3:print using "###"; Empfangen
locate 2,3:print using "###"; Gesendet
End If
Next cnt
End If
End If
if timer>tim+.25 then
locate 1,12:print using "###";dwl*4
locate 2,12:print using "###";upl*4
dwl=0
upl=0
tim=timer
end if
title$=progname+": "+str$(Empfangen)+"\"+str$(Gesendet)+einheit+"-"+str$(dwl)+"\"+str$(upl)+"kb/s"
windowtitle$ title$
'Setze Fenster neu als topmost falls ein anderes Topmost-Programm im Vordergrund ist.
hwnd=FindWindow(0,strptr(title))
SetWindowPos( hwnd,HWND_TOPMOST, 0, 0, 0, 0,SWP_NOSIZE OR SWP_SHOWWINDOW or SWP_NOMOVE)
SLEEP 50
LOOP
END
' Wandelt ein (Byte-) Array in einen String um
Function GetName(arr() as ubyte) As String
Dim i As uInteger
Dim z As String
For i = LBound(arr) To UBound(arr)
z = z + Chr$(arr(i))
Next i
GetName = z
End Function
|
3.Problem:
Ich würde gerne das Programm aus der Taskleiste rausnehmen.
Es soll aber im Taskmanager unter Programme stehen bleiben.
Wahrscheinlich würde es mit der Funktion CreateWindow und dem Flag WS_EX_TOOLWINDOW funktionieren aber dann müsste ich so tief in Win-API eindringen, dass es sich nicht mehr lohnt.
Bezieht sich auf das Programm von Problem 2.
Ich hoffe ich habe es verständlich erklärt und es gibt mögliche Lösungen.
mfg noop |
|
Nach oben |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 13.11.2006, 15:56 Titel: |
|
|
Zum 1. Problem:
Irgendwo gabs in dem Forum schonmal das gleiche Problem, und eine Lösung:
Man kann das einfach von der FBGFX-lib auslesen:
http://forum.qbasic.at/viewtopic.php?p=19722#19722
Damit sollte es gehen _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
|
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 14.11.2006, 12:01 Titel: |
|
|
Danke erstmal für die Antwort.
Leider kann ich damit nicht wirklich was anfangen.
Wie bekomme ich da denn raus welches Programm oben liegt?
Das ist doch eher eine erweiterte Version von screeninfo oder habe ich was übersehen?
(kann erst am Freitag wieder on) |
|
Nach oben |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 14.11.2006, 15:57 Titel: |
|
|
Ups, hab deine Frage nicht richtig verstanden.
Ich dachte du wollstest was anderes machen
EDIT: 5min Suche bei google:
Code: |
'Dieser Source stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.
'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!
'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm ---------
' Steuerelement: Timersteuerelement "Timer1"
Option Explicit
Private Declare Function GetActiveWindow Lib _
"user32" () As Long
Dim bFocus As Boolean
Private Sub Form_Load()
Timer1.Interval = 50
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Dim hWnd As Long
hWnd = GetActiveWindow
If hWnd = Me.hWnd Then
If bFocus = False Then
bFocus = True
Me.Caption = "Aktives Fenster"
End If
Else
If bFocus = True Then
bFocus = False
Me.Caption = "Nicht aktiv"
End If
End If
End Sub
'---------- Ende Formular "Form1" alias Form1.frm ----------
'-------------- Ende Projektdatei Project1.vbp -------------- |
Den Code kannst du verwenden:
Code: | Declare Function GetActiveWindow cdecl Lib "user32" Alias "GetActiveWindow" As hwnd
Dim As hwnd aktives_fenster
aktives_fenster=GetActiveWindow
Print aktives_fenster
|
Zu deinem 3. Problem habe ich auch eine Lösung gefunden:
Code: |
#include "windows.bi"
#include "vbcompat.bi"
ShowWindow me.hwnd , SW_HIDE 'fenster ausblenden
Sleep 10000, 1
ShowWindow me.hwnd , SW_SHOW 'und nach 10 sek wieder einblenden
|
Nicht getestet, sollte aber funktionieren. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 14.11.2006, 16:25 Titel: |
|
|
Hi,
1. FindWindow ist m.W. nicht für das auffinden des TOPMOST - Window geeignet (wenn ich den Titel des aktiven (TOPMOST) Window nicht habe).
Ich habe aber keine Lösung dafür .
2. Wenn du das eigene Fenster immer wieder als TOPMOST aktivierst legt es sich natürlich immer in den Vordergrund.
Nur wenn du das änderst (z.B. nur alle 10sek auf TOPMOST setzen) werden auch Kontextmenues bedienbar sein.
(mein Beispiel ist keine gute Lösung, irgendwie müsste man dies ereignisgesteuert ein- oder ausschalten??)
3.---? _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
noop
Anmeldungsdatum: 04.05.2005 Beiträge: 259
|
Verfasst am: 17.11.2006, 12:14 Titel: |
|
|
Danke für die Posts.
@programmierer:1.Das zeigt mir zwar nicht welches Fenster an oberster Stelle liegt, aber es löst mein Problem;)
3.Leider wird dann aber auch mein Fenster ausgeblendet.Das wollte ich aber gerne behalten.
Warum man da die vbcombat.bi mitladen muss habe ich auch nicht ganz verstanden.Ist doch pure windows.bi Syntax
@Volta:2. Ja daran hatte ich auch zuerst gedacht.
Mir ist jetzt die idee gekommen dass ich ja auf rechtsklicke überprüfen kann. Dann muss ich nur noch irgendwie das Handle rausbekommen und wenn das nicht mehr existiert dann kann ich mein Fenster wieder in den Vordergrund pflanzen.Ich werde dahin mal was suchen.
mfg noop
Edit:
Hier meine Lösung zu Problem 1.
Code: |
#include once "windows.bi"
dim hwnd as hwnd
do
hwnd=GetForegroundWindow
locate 1:print hwnd;space(15)
sleep 5
loop until inkey$=chr$(27)
|
Für mich ist aber GetActiveWindow praktischer.
Zu Problem 2:Mit Mausrechtsklick klappt das nicht richtig.
Schon etwas besser aber Kontextmenüs haben ja auch Verzweigungen und da klickt man ja dann oft drauf...
Und dann gibt es noch die Taste auf der Tastatur, die fast gleich rechtsklick ist...
Wie geht eigentlich Windows mit Kontextmenüs um?
Die haben ja keinen Titel, sind keine eigenen Prozesse und haben nur manchmal eigene Handles.
Wenn man auf dem Desktop rechtsklick macht zeigt das Programm, das ich gerade gepostet habe, nichts an.
Jetzt habe ich gar keine Idee mehr wie ich die erkenne, wenn die noch nicht einmal eigene Handles haben
Edit2:
Ich habe mal meine zwei anderen doch sehr ungewöhnlichen Probleme im englischen Forum gepostet.
http://www.freebasic.net/forum/viewtopic.php?p=54912#54912 |
|
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.
|
|