Jeg er ved at lave et klient/server netcafe-program, og det er så godt som færdigt.
Jeg har dog lidt problemer med at "låse" brugerens pc når tiden er udløbet.
Dvs. jeg vil gerne vise et skilt på skærmen med en "Tiden er gået" besked. Det kan også lade sige gøre ved hjælp af en alm. form som jeg bringer øverst (OnTop). Desværre kun i alm. programmer.
I spil som fx Counter Strike "trænger" min besked simpelt hen ikke igennem. Hvis jeg manuelt afslutter spillet, er min besked inde bag ved.
Er der nogen der har en ide til hvordan og hvorledes man griber dette an? Jeg vil gerne kunne lave en besked der trænger igennem og lægger sig øverst på hvad som helst. Jeg er selv ved at undersøge om det kan lade sig gøre med DirectX, men alle input modtages med kyshånd - også gerne forslag til andre veje eller måder at fortælle brugeren at hans tid er gået...
Jeg ved ikke om du har mulighed for at se hvilke tasks brugeren kører, for så kan du dræbe disse. prøv at søge på google "kill.exe" Det er en lille film som man kan køre og så dræber den en proces, ligesom i unix.
Som det er lige nu læser jeg alle kørende tasks når mit program starter, og når brugerens tid udløber, slår jeg alle tasks ihjel som ikke kørte på starttidspunktet. Denne løsning er dog ikke så god. Alle klienterne er Win98 og nogle crasher.. andre gør ikke. Det er lidt hip som hap med hvad der sker. Løsningen er fin hvis men nøjes med at bruge Internet, lommeregner o.lign. programmer. Lige så snart der kører nogle af de "tunge" spil, sker der mystiske ting. Og det er det jeg gerne vil uden om. Så jeg tænkte, at man skulle gå lidt efter at lave noget via DirectX eller lign.
måske kan du bruge "BlockInput" låser tast/mus så kan brugeren da ikke spille vider :))
Option Explicit
Private Declare Function BlockInput Lib "user32" (ByVal fBlock As Long) As Long Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Form_Activate() DoEvents 'block the mouse and keyboard input BlockInput True 'wait 10 seconds before unblocking it Sleep 10000 'unblock the mouse and keyboard input BlockInput False End Sub
Jeg ville nok ikke lade mit klient program slå taskene ihjel, jeg ville bare lade det holde maskinen i f.eks. 5 minutter, således at der var tid til få låst op igen, måske forlænge sin "timeslice". Derefter ville jag lade klient programmet "overtage" inputdevice (mus/tastatur) , genkende tasket f.eks "Cstrike" og lukke det på en autoriseret måde. lidt mere omstændigt, men meget venligere overfor styresystemet. Hvilket OS kører du på (win2000 server mod xp klienter ?)
hov, du skriver 98 klienter. er det SE ? Måske er 98 ikke det bedste valg, men det skal jo kunne lade sig gøre.
tænker lige højt... Dit problem er at din msgbox skal have focus og placeres ovenpå alt andet. Jeg gætter på at f,eks. C-strike ikke læner sig op ad windows, men kører sit eget ræs, så du er nok nødt til at være temmelig hård for at få focus til din msgbox. Du skal nok suspendere alle andre tasks. hmmm, må lige læse i bogen..
Dit forslag er også hvad jeg selv havde tænkt mig hvis jeg ikke finder andre løsninger. Det er ikke for at være grov et jeg afviser dit svar, men fordi det ikke løser mit egentlige spørgsmål :o)
Du har fat lige midt i sagens kerne. Det er godt nok ikke en msgbox jeg prøver at tvinge frem, men en form med noget tekst på. Men sikkert lidt det samme problem. Min tanke var også, at Cstrike ikke læner sig op ad Windows, og jeg ville derfor undersøge, om man evt. kunne lave sin msg-form/box via DirectX eller lign. Hvad er det for en bog du lige skulle læse i??
Med følgende kode kan du "clean" lukke et program eller en process ned. Dette program kunne, som i dit tilfælde, være Counter-Strike...
'I et module: Option Explicit
Private Declare Function EnumWindows& Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Declare Function IsWindowVisible& Lib "user32" (ByVal hwnd As Long) Private Declare Function GetParent& Lib "user32" (ByVal hwnd As Long)
'*** Til at lukke program med: Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const WM_CLOSE = &H10
Dim sPattern As String, hFind As Long
Private Function FindActivateTitle(ByVal hwnd As Long, ByVal lParam As Long) As Long Dim k As Long, sName As String If IsWindowVisible(hwnd) And GetParent(hwnd) = 0 Then sName = Space$(128) k = GetWindowText(hwnd, sName, 128) If k > 0 Then sName = Left$(sName, k) If lParam = 0 Then sName = UCase(sName) If sName Like sPattern Then hFind = hwnd FindActivateTitle = 0 Exit Function End If End If End If FindActivateTitle = 1 End Function
Public Function ActivateAppHwnd(sTitle As String, Optional sMatchCase As Boolean = True) As Long sPattern = sTitle: hFind = 0 If Not sMatchCase Then sPattern = UCase(sPattern) EnumWindows AddressOf FindActivateTitle, sMatchCase ActivateAppHwnd = hFind End Function
'Lukker en process ud fra dens titel, f.eks. "Microsoft Internet Explorer" el. "*Internet*" 'Der kan bruges * (stjerne) i den ene eller begge ender af navnet for at angive at det kun er en del af programnavnet. PostMessage ActivateAppHwnd("hl", False), WM_CLOSE, 0&, 0&
Jeg har sat programnavnet til "hl" som er titlen på Half-life/Counter-strike. Denne kan selvfølgelig ændres. Håber du kunne bruge det :) -Sion
Hvad du proever paa, er desvaerre paa en general og "ren" maade. Problemet i denne sammenhaeng, er directX, som overtager hele skaermen.
1) Er det overhovedet interessandt for netcafeen bare og smaekke kundernes maskiner ned? Hvorfor ikke bare lade dem spille lidt laengere og bagefter smaekke dem for de ekstra penge... 2) Hvis du ser paa f.eks. Boomtown i KBH, sidst jeg checkede, saa bootede de bare maskinerne. Det er rigtigt at det ikke er saerligt paent mod styresystemet (de bruger ME), men de har en geninstallerings procedure, hvor de trykker paa 3 knapper og saa er hele systemet vaek (GHOST).
Anyway, bruger du Win2k, saa kan du godt have held med bare og lukke programmerne... Bare taenk paa, at hvis brugeren sidder i Word, og du lige har slettet alt hans arbejde... Bliver han nok ikke glad for.
For at lukke et program paa en paen maade, skal du bruge ovenstaaende eksempel, med PostMessage. Denne function svarer til at du klikker paa det lille kryds i hjoernet, men nogle programmer ignorerer denne besked (F.eks. word, der spoerger om du vil gemme, inden du slukker helt ned) saa du kan lige vente 10 sek og checke om programmet nu ogsaa er helt doedt. Hvis ikke, kan du kalde en anden function som hedder noget lignende DestroyWindow, Kill, KillApp... Soeg paa google...
kan du ik bare bruge en shutdown fil den plejer at være rimilig efektiv ved ikk om du enventuelt kan ligge dne ind i dit program
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.