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:

WinAPI:FindWindow/Vordergrund,Symbol in Taskleiste entfernen

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



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 13.11.2006, 09:17    Titel: WinAPI:FindWindow/Vordergrund,Symbol in Taskleiste entfernen Antworten mit Zitat

Hallo,

1.Problem das ich habe ist das FindWindow nicht so funktioniert wie ich mir das vorstelle böse zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 13.11.2006, 14:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 14.11.2006, 11:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 14.11.2006, 14:57    Titel: Antworten mit Zitat

Ups, hab deine Frage nicht richtig verstanden.
Ich dachte du wollstest was anderes machen grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 14.11.2006, 15:25    Titel: Antworten mit Zitat

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 traurig .

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 17.11.2006, 11:14    Titel: Antworten mit Zitat

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 Hmmm....
@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 missbilligen


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
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 -> Windows-spezifische Fragen 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