Ik heb het volgende probleem:
Mijn applicatie krijgt een bericht binnen en moet op dat moment dwingend op de voorgrond komen. Opzich geen probleem ware het niet dat MS heeft besloten dit te blokeren van W98. Wat er gebeurd is dat applicatie in de taakbalk staat te knipperen voor aandacht maar het form word niet op de voorgrond getoond.
Omgeving:
- Windows 2000 Professional (SP4)
- Windows XP Professionel (SP1)
- Visual Basic 6 (SP5)
In mijn speurtocht door de MS Platform SDK kwam ik de routine SetForegroundWindow tegen met een heel stuk uitleg over hoe het te omzeilen doormiddel van het aanroepen van SystemParametersInfo met de parameter SPI_SETFOREGROUNDLOCKTIMEOUT. Meteen geprobeerd om dit te implementeren in VB6.
Uiteindelijk uitgekomen op deze code om de functionaliteit te testen:
Als ik nou probeer de timeout te zetten op 10ms dan maakt deze routine er 1242376ms van. Ik heb allerlei dingen geprobeerd (2de ipv 3de parameter gebruiken, meegeven als een VarPtr, etc.) maar niks hielp.
Na wat gezocht te hebben in diverse nieuwsgroepen een post tegen gekomen van Peter Below (TeamB member) met een voorbeeld voor Delphi. Dit heb ik geprobeerd in D7 maar had helaas hetzelfde resultaat als mijn VB applicatie. Ik heb mijn Delphi code zo niet bij de hand maar indien gewenst zal ik deze op een later tijdstip posten.
Er zijn twee dingen waar het volgens mij aan kan liggen maar ik kom er niet uit.
1) Ik geef mijn gewenste waarde voor de timeout verkeerd door. In de MS Platform SDK is niks te vinden over het datatype dat je moet gebruiken om de waarde door te geven.
2) Er staat in de SDK een opmerking bij de SPI_SETFORE... parameter: "The calling thread must be able to change the foreground window, otherwise the call will fail.". Nou weet ik niet zeker of mijn applicatie die rechten heeft en ik weet ook niet hoe dit uit te vragen. Feit is wel dat de aanroep van de API-call de waarde 1 terug geeft wat volgens de SDK aangeeft dat de call succesvol is gedaan.
Heeft er iemand een idee waar ik moet kijken om dit probleem op te lossen? Ik kom er namelijk echt niet meer uit. Vast al bedankt iig!
Mijn applicatie krijgt een bericht binnen en moet op dat moment dwingend op de voorgrond komen. Opzich geen probleem ware het niet dat MS heeft besloten dit te blokeren van W98. Wat er gebeurd is dat applicatie in de taakbalk staat te knipperen voor aandacht maar het form word niet op de voorgrond getoond.
Omgeving:
- Windows 2000 Professional (SP4)
- Windows XP Professionel (SP1)
- Visual Basic 6 (SP5)
In mijn speurtocht door de MS Platform SDK kwam ik de routine SetForegroundWindow tegen met een heel stuk uitleg over hoe het te omzeilen doormiddel van het aanroepen van SystemParametersInfo met de parameter SPI_SETFOREGROUNDLOCKTIMEOUT. Meteen geprobeerd om dit te implementeren in VB6.
Uiteindelijk uitgekomen op deze code om de functionaliteit te testen:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| Private Declare Function SystemParametersInfo Lib "user32" _ Alias "SystemParametersInfoA" _ (ByVal uAction As Long, _ ByVal uParam As Long, _ ByRef lpvParam As Any, _ ByVal fuWinIni As Long) As Long Private Const SPI_GETFOREGROUNDLOCKTIMEOUT As Long = &H2000 Private Const SPI_SETFOREGROUNDLOCKTIMEOUT As Long = &H2001 Private Const SPIF_UPDATEINIFILE As Long = &H1 Private Const SPIF_SENDWININICHANGE As Long = &H2 Private Sub SetLockTimeout Dim lngFResult As Long Dim TimeOut As Double TimeOut = CDbl(Text1.Text) lngFResult = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0&, TimeOut, 0) MsgBox "lngFResult=" & CStr(lngFResult) End Sub |
Als ik nou probeer de timeout te zetten op 10ms dan maakt deze routine er 1242376ms van. Ik heb allerlei dingen geprobeerd (2de ipv 3de parameter gebruiken, meegeven als een VarPtr, etc.) maar niks hielp.
Na wat gezocht te hebben in diverse nieuwsgroepen een post tegen gekomen van Peter Below (TeamB member) met een voorbeeld voor Delphi. Dit heb ik geprobeerd in D7 maar had helaas hetzelfde resultaat als mijn VB applicatie. Ik heb mijn Delphi code zo niet bij de hand maar indien gewenst zal ik deze op een later tijdstip posten.
Er zijn twee dingen waar het volgens mij aan kan liggen maar ik kom er niet uit.
1) Ik geef mijn gewenste waarde voor de timeout verkeerd door. In de MS Platform SDK is niks te vinden over het datatype dat je moet gebruiken om de waarde door te geven.
2) Er staat in de SDK een opmerking bij de SPI_SETFORE... parameter: "The calling thread must be able to change the foreground window, otherwise the call will fail.". Nou weet ik niet zeker of mijn applicatie die rechten heeft en ik weet ook niet hoe dit uit te vragen. Feit is wel dat de aanroep van de API-call de waarde 1 terug geeft wat volgens de SDK aangeeft dat de call succesvol is gedaan.
Heeft er iemand een idee waar ik moet kijken om dit probleem op te lossen? Ik kom er namelijk echt niet meer uit. Vast al bedankt iig!