vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Windows API
SetWindowPos: Bug? Fenster nicht oben! 
Autor: E7
Datum: 16.02.05 15:03

Hi,

ich glaube so langsam bin ich am Verzweifeln... Ich bastel gerade an einer Anwendung mit vielen, vielen Fenstern. Jedes dieser Fenster besitzt einen Button, mit dem das jeweilige Fenster mittels SetWindowPos systemweit als Topmost-Fenster angezeigt wird (also nicht verdeckt werden kann)...

Nun kann der Nutzer durch Klicken auf den Button in der Titelleiste die Topmost-Eigenschaft ein- oder ausschalten, was auch für das jeweilige Fenster ganz gut funktioniert... Aber: Die API scheint diese Eigenschaft nicht nur einem Fenster zu entziehen, sondern allen...

Hier mal ein Beispielcode. Ihr benötigt dazu lediglich 2 Forms, in der ersten gehört dieser Code rein:

Option Explicit
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal _
  hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal cx As Long, _
  ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
 
Private Sub Form_Load()
'Erst mal zweite Form laden:
Form2.Show
'Erste Form nach oben:
SetWindowPos Me.hWnd, -1, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
'Zweite Form nach oben:
SetWindowPos Form2.hWnd, -1, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
'Erste Form nicht mehr oben:
SetWindowPos Me.hWnd, -2, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub
Der Code macht folgendes:
* Form1 nach oben
* Form2 nach oben
* Form1 nicht mehr nach oben

Windows führt jetzt irgendwie noch den Schritt "Form2 nicht mehr oben" aus, obwohl ich den eigentlich nie wollte... Ich bin schon fast am verzweifeln, die anderen Formulare sollen doch oben bleiben... Wer hat von euch schon mal ähnliche Erfahrungen gemacht? Wer kennt eine Lösung? Ich freue mich schon auf eure zahlreichen Antworten

E7

???????????????????????????????????????????????????????????
e7o.de | jetzt (wirklich) neu!

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: ModeratorMartoeng (Moderator)
Datum: 16.02.05 15:42

MSDN: "A window can be made a topmost window either by setting the hWndInsertAfter parameter to HWND_TOPMOST and ensuring that the SWP_NOZORDER flag is not set, or by setting a window's position in the Z order so that it is above any existing topmost windows. When a non-topmost window is made topmost, its owned windows are also made topmost. Its owners, however, are not changed."
..
"If a topmost window is repositioned to the bottom (HWND_BOTTOM) of the Z order or after any non-topmost window, it is no longer topmost. When a topmost window is made non-topmost, its owners and its owned windows are also made non-topmost windows."

siehe hier: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setwindowpos.asp


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: E7
Datum: 16.02.05 16:06

Hi,

Zitat:

When a topmost window is made non-topmost, its owners and its owned windows…


ja, Eltern (parent) und Kinder (child). Meine Fenster existieren aber nebeneinander, und haben höchstens gemeinsame Vorfahren

Mittels .Show werden die Fenster ja rein theoretisch als Geschwister angezeigt, stehen also nicht direkt miteinander in Beziehung.

In meinem Programm gibt es ein Fenster, das zeigt alle Unterfenster auch einfach mittels .Show an - damit existieren alle Fenster nebeneinander, es können ja nicht einfach irgendwelche Kinder bevorzugt werden

Außerdem denke ich, .Show ist eine Funktion des anzuzeigenden Fensters, und so lange kein Parameter mitgeliefert wird, auch unabhängig von seinem aufrufenden Fenster... Bzw.: Was ist, wenn ich das Fenster von einem Modul aus anzeige?

E7

???????????????????????????????????????????????????????????
e7o.de | jetzt (wirklich) neu!

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: ModeratorMartoeng (Moderator)
Datum: 16.02.05 19:24

Ne, der Text sagt eigentlich schon, dass das was Du machen willst nicht so geht.
VB ist, was Fenster angeht, eh nicht so perfekt.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: E7
Datum: 16.02.05 19:29

aber irgendwie muss das doch möglich sein, dass wenn ein Fenster nicht mehr Ontop ist, die anderen dennoch oben bleiben? Die Taskleiste verschwindet schließlich auch nicht einfach...

Im Grunde kann ich ja sämtliche Forms durchgehen und für die betroffenen Forms wieder SetWindowPos aufrufen - aber so wirklich gut ist die Lösung nicht...

???????????????????????????????????????????????????????????
e7o.de | jetzt (wirklich) neu!

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: ModeratorMartoeng (Moderator)
Datum: 17.02.05 18:54

Hm, nicht so dolle hast Du recht.
Schon mal in ner anderen Programmiersprache versucht? Wenn das Problem da nicht auftritt, dann liegt's an VB.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: E7
Datum: 17.02.05 20:03

Hi,

mmmhh... andere Sprache? Leider kann ich nur noch PHP und JavaScript, naja, und etwas QBasic, aber andere Sprachen kann ich leider nicht nachvollziehen

Und ob das an VB liegt - möglich, aber so sehr viel kriegt VB von meinem Aufruf von SetWindowPos nicht mit - Resize wird nicht ausgelöst, und ob VB die anderen Ereignisse verarbeitet - wer weiß...

E7

???????????????????????????????????????????????????????????
e7o.de | jetzt (wirklich) neu!

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: Guido Eisenbeis
Datum: 02.03.05 01:28

Option Explicit
 
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal _
  hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal cx As Long, _
  ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
 
Private Sub Form_Load()
   'Erst mal zweite Form laden:
   Form2.Show
   'Erste Form nach oben:
   SetWindowPos Me.hWnd, -1, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
   Me.Show ' <-- Anzeigen der Form abschließen/sicherstellen
   'Zweite Form nach oben:
   SetWindowPos Form2.hWnd, -1, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
'   'Erste Form nicht mehr oben: 
'   SetWindowPos Me.hWnd, -2, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE ' <-- _
  weglassen
End Sub
Guido
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: E7
Datum: 02.03.05 14:03

Ähm... Wie verwende ich jett deinen Code? Bzw. warum soll ich die letzte Zeile weglassen? Das ist doch genau der Punkt, die Zeile brauch ich ja...

???????????????????????????????????????????????????????????
e7o.de | jetzt (wirklich) neu!

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: Guido Eisenbeis
Datum: 02.03.05 21:07

Hast du's ausprobiert?

"HWND_NOTOPMOST Places the window above all non-topmost windows (that is, behind all topmost windows). This flag has no effect if the window is already a non-topmost window."

Auf Deutsch: Der Parameter "HWND_NOTOPMOST" hat keinen Effekt, wenn das Fenster schon ein "non-topmost window" ist. (Zumindest offensichtlich nicht den gewünschten!)


Guido
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: E7
Datum: 03.03.05 13:55

Hi,

mein ganzes Problem ist ja nicht "kein Effekt", sondern "1 Effekt zu viel". Ich möchte von den Topmost-Fenstern eines nicht mehr oben haben - und Windows setzt das zweite auch noch zurück, das ist ein Effekt zu viel

E7

???????????????????????????????????????????????????????????
e7o.de | jetzt (wirklich) neu!

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: RapID23o5
Datum: 10.03.05 15:40

Wenn es so nicht geht dann versuch es doch mit der DeferWindowPos funktion damit setzt du für mehrere Fenster gleichzeitig ein Handle! Irg.wie StartDeferWindowPos dann die Defs und dann EndDeferWindowPos "!

Ohne Mampf, kein Kampf !

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: E7
Datum: 10.03.05 19:30

Hi,

die Funktion sieht zwar ganz nett aus - aber im Endeffekt macht es keinen Unterschied, ob ich nun das ganze mit einer Schleife und SetWindowPos mache, oder mit DeferWindowPos - die Fenster werden zurückgesetzt, und anschließend muss ich diese wieder nach vorne bringen. Genau das ist es, was ich vermeiden will.

E7

???????????????????????????????????????????????????????????
e7o.de | jetzt (wirklich) neu!

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: RapID23o5
Datum: 11.03.05 16:09

' - - - - - - - - - - - - - - - - - - - - - - -
' Erstelle 5 Formen
' Namen: Form1 - Form4, Topper
'
' Erstelle 6 CommandButtons auf Form1
' Namen: Command1 - Command6
'
' Füge Nachfolgenden code in den Privaten Deklarations Bereich der Form1
' Aussprobieren und spass haben ... ;)
' - - - - - - - - - - - - - - - - - - - - - - -
' Ich denke mal der restliche Code erklärt sich von selbst!
' - - - - - - - - - - - - - - - - - - - - - - -
 
Option Explicit
 
Private Declare Function SetWindowPos Lib "user32" (ByVal _
    hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, _
    ByVal y As Long, ByVal cx As Long, ByVal cy As Long, _
    ByVal wFlags As Long) As Long
 
Private Sub SetTopLevelWindow(ByVal hWnd As Long, Optional topmost As Boolean = _
  True)
    Const HWND_NOTOPMOST = -2
    Const HWND_TOPMOST = -1
    Const SWP_NOMOVE = &H2
    Const SWP_NOSIZE = &H1
    SetWindowPos hWnd, IIf(topmost, HWND_TOPMOST, HWND_NOTOPMOST), 0, 0, 0, 0, _
      SWP_NOMOVE + SWP_NOSIZE
    SetWindowPos Me.hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
End Sub
 
Private Sub Command1_Click()
SetTopLevelWindow Form2.hWnd
End Sub
 
Private Sub Command2_Click()
SetTopLevelWindow Form3.hWnd
End Sub
 
Private Sub Command3_Click()
SetTopLevelWindow Form4.hWnd
End Sub
 
Private Sub Command4_Click()
SetTopLevelWindow Form2.hWnd, False
End Sub
 
Private Sub Command5_Click()
SetTopLevelWindow Form3.hWnd, False
End Sub
 
Private Sub Command6_Click()
SetTopLevelWindow Form4.hWnd, False
End Sub
 
Private Sub Form_Initialize()
Command1.Caption = "Form2 Top"
Command2.Caption = "Form3 Top"
Command3.Caption = "Form4 Top"
Command4.Caption = "Form2 NotTop"
Command5.Caption = "Form3 NotTop"
Command6.Caption = "Form4 NotTop"
Command1.Move 240, 2000, 800, 500
Command2.Move 240, 2500, 800, 500
Command3.Move 240, 3000, 800, 500
Command4.Move 1040, 2000, 800, 500
Command5.Move 1040, 2500, 800, 500
Command6.Move 1040, 3000, 800, 500
End Sub
 
Private Sub Form_Load()
Form1.Move 1000, 1000, 2200, 5000
Form2.Move 1000, 1000, 50, 50
Form3.Move 1500, 1100, 50, 50
Form4.Move 2000, 1200, 50, 50
Topper.Move -1000, -1000, 0, 0
Form2.Show
Form3.Show
Form4.Show
Topper.Show
SetTopLevelWindow Form2.hWnd
SetTopLevelWindow Form3.hWnd
SetTopLevelWindow Form4.hWnd
SetTopLevelWindow Topper.hWnd
End Sub

Ohne Mampf, kein Kampf !

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: E7
Datum: 11.03.05 17:58

Hi,

mmhmhh... der Code funktioniert so weit ganz gut - sobald aber Form1 auch Topmost ist, zeigt sich wieder das misteriöse Verhalten...

Ich hab mal noch einen Commandbutton dazu:

Private Sub Command7_Click()
SetWindowPos Me.hWnd, -1, 0, 0, 0, 0, 3
End Sub
Ich klicke auf diesen Button, und anschließend auf einen beliebigen anderen, der ein Fenster zurück in den Hintergrund setzt - und promt ist Form1 ebenfalls weg. Genau das ist das Problem, mein allererstes Fenster ist grundsätzlich oben...

Falls ihr das ganze mal selbst im Programm ausprobieren wollt: http://sourceforge.net/project/showfiles.php?group_id=131465... Die .zip und die .7z sind der Sourcecode (beide bis auf ihre Komprimierung identisch). Der Code findet sich in frmNote.imgControl_Click(index=1), zw. ELSE und ENDIF... Natürlich freu ich mich auch über andere Verbesserungen im Programm, ist schließlich OpenSource

Die letzte Zeile von SetTopLevelWindow() hab ich übrigens auskommentiert, da sich dieses Verhalten von selbst einstellt ist aber wurscht...

E7

???????????????????????????????????????????????????????????
e7o.de | jetzt (wirklich) neu!

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: BasTler
Datum: 14.04.05 13:34

Hi E7,

kann dir bei deinem Prob's leider nicht helfen und weiß auch nicht so recht, wofür du das Ganze brauchst, aber das Design und die Anordnung der Elemente gefällt mir. Wollte ich nur mal sagen.

Gruß BasTler
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: BasTler
Datum: 14.04.05 13:53

Hi E7,

nochmal ich, vielleicht kann ich dir doch etwas helfen, durch ein paar Tipps bzw. Hinweise auf andere API-Aufrufe die Fenster betreffen.
AnyPopup (User32) ermittelt, ob am Bildschirm ein Überlagerungsfenster sichtbar ist.
BeginDeferWindowPos (User32) verschiebt mehrere Fenster gleichzeitig und zeichnet den Bildschirm neu.
BringWindowToTop (User32) stellt das angegebene Fenster in den Vordergrund (Z-Position).
CBTProc (IMPORT) Rückruffunktion, die vom System aufgerufen wird, bevor ein Fenster aktiviert, erzeugt, freigegeben, zum Symbol verkleinert, zum Vollbild vergrößert, verschoben oder in seiner Größe verändert wird.
ChangeClipboardChain (User32) löscht das angegebene Fenster aus der Kette der Clipboard-Viewers.
ChildWindowFromPoint(User32) liefert einen Handle (Verweis) auf das Fenster zurück, über dem sich der Mauszeiger beim Auslösen einer Mausnachricht befand.
DeferWindowPos (User32) bestimmt die Positionskoordinaten für die zu verschiebenden Fenster.
DestroyWindow (User32) entfernt das angegebene Fenster.
EnableCommNotification (IMPORT) aktiviert oder deaktiviert die Übergabe von WM_COMMNOTIFY-Botschaften an das angegebene Fenster.
EnumThreadWindows (User32) ermittelt alle Fenster eines bestimmten Tasks.
GetActiveWindow (User32) liefert einen Handle (Verweis) auf das aktive Fenster, das dem Thread zugeordnet ist, der die Funktion aufruft.
GetCapture (User32) stellt einen Handle bereit, der das Fenster bezeichnet, das alle Mauseingaben auf sich zieht. Zu einem bestimmten Zeitpunkt hat nur ein einzelnes Fenster die Fähigkeit, Mauseingaben zu bearbeiten; es empfängt die Mauseingaben auch, wenn sich der Mauszeiger außerhalb seiner Grenzen befindet.
Wie erwähnt, wollte nur helfen, nicht verwirren.

Gruß BasTler
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: E7
Datum: 14.04.05 18:07

Hi,

die Liste ist zwar umfangreich - aber leider kann man die Fenster nur mittels SetWindowPos() dauerhaft ontop und wieder zurück setzen. Das Problem ist ja hier, dass SetWindowPos eben das macht, was sie tun soll - nur eben etwas übereifrig.

E7

???????????????????????????????????????????????????????????
e7o.de | jetzt (wirklich) neu!

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: RapID23o5
Datum: 03.06.05 16:03

Dieser Fehler ist übrig. ein bekannter BUG (Q192254) siehe 3.! Allerdings nur in VB in C und so sollte SetWindowPos richtig funktionieren. Ich denke das hat was mit dem VB-SingleThreadingModel zu tun . . .

SYMPTOMS
When using the SetWindowPos() API in Visual Basic to set the Topmost window flag, these known problems may occur:
1. When an application is running in the Visual Basic IDE, clicking on the Desktop or My Computer icon causes the Topmost window setting to be turned off. This does not occur when the application is a compiled EXE. Please see the REFERENCES section below for more information.
2. Setting the Topmost flag for a parent form does not set it for that form's children. This conflicts with the documented behavior of the SetWindowPos function.

3. When calling SetWindowPos with the NoTopmost flag for a Visual Basic form, all forms in the project are set to NoTopmost.


leider scheint es kein WorkAround hierfür zu geben... Naja.... Ich bleib dran ;) ma sehn

Ohne Mampf, kein Kampf !

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: ModeratorMartoeng (Moderator)
Datum: 03.06.05 18:03

Danke für die Mühe!


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: SetWindowPos: Bug? Fenster nicht oben! 
Autor: E7
Datum: 04.06.05 19:58

Hi,

mmmhhh.... sehr schlecht, also ist der einzige Workaround die langweilige Möglichkeit, alle Fenster in einer Schleife durchzugehen... Das ist schlecht...

(Link für alle, die's interessiert... So nebenbei: Hier ist ein weiterer Bug (oder zumindest ein Fehler), die Links unten bei Verweise sind nicht verlinkt )

E7

???????????????????????????????????????????????????????????
e7o.de | jetzt (wirklich) neu!

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel