Avatar billede fray Nybegynder
24. februar 2003 - 12:02 Der er 18 kommentarer

Net Cafe-program / "trænge igennem" et spil

Hej Alle,

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

Med venlig hilsen

Michael Fray
Avatar billede roo104 Nybegynder
24. februar 2003 - 12:13 #1
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.
Avatar billede arnvig Nybegynder
24. februar 2003 - 12:34 #2
Du har et klient task kørende på hver PC, som holder øje med tiden, hjulpet af serveren ?
Avatar billede fray Nybegynder
24. februar 2003 - 13:33 #3
Hejsa.

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.
Avatar billede fray Nybegynder
24. februar 2003 - 13:34 #4
Til Arnvig ->

Ja, du har forstået det helt rigtigt.. Læs evt. mit svar til roo104.
Avatar billede sjh Nybegynder
25. februar 2003 - 00:44 #5
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
Avatar billede arnvig Nybegynder
25. februar 2003 - 10:32 #6
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 ?)
Avatar billede arnvig Nybegynder
25. februar 2003 - 10:41 #7
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..
Avatar billede fray Nybegynder
25. februar 2003 - 10:49 #8
Hej Sjh..

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)

Hilsen
Fray
Avatar billede fray Nybegynder
25. februar 2003 - 10:52 #9
-> Arnvig

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??

Hilsen

Fray
Avatar billede arnvig Nybegynder
25. februar 2003 - 11:24 #10
Fray:

Her er et link til et par API'er som måske kan løse problemet:

SetFocus
SetActiveWindow

Desuden kan du evt. bruge
SendInput til at styre en kontrolleret nedlukning af diverse vanskelige programmer

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput.asp

Hvilken api bruger du til at skyde processor ned med ?
Avatar billede sion Nybegynder
25. februar 2003 - 19:30 #11
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
Avatar billede sion Nybegynder
25. februar 2003 - 19:31 #12
... og du bruger funktionen ved:

  '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
Avatar billede chris2k Nybegynder
22. marts 2003 - 04:53 #13
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...

Haaber du kan bruge det til noget...
Avatar billede chris2k Nybegynder
22. marts 2003 - 04:55 #14
Vi tar' lige foerste sektion igen :-)

Hvad du proever paa, er desvaerre umugeligt paa en general og "ren" maade. Problemet i denne sammenhaeng, er directX, som overtager hele skaermen.
Avatar billede arnvig Nybegynder
24. marts 2003 - 10:17 #15
Det må da være muligt, via styresystemmet, at give DirectX besked på at suspendere al aktivitet ?
Avatar billede chris2k Nybegynder
24. marts 2003 - 23:56 #16
Det tvivler jeg paa. Anyway, det ville hellerikke vaere en god ide, at kun designe det efter DirectX. Hvad saa med spil der ikke koerer directx?
Avatar billede sion Nybegynder
10. december 2003 - 11:03 #17
Fandt du en løsning på dit spørgsmål, fray?
Avatar billede asbjorn141 Nybegynder
05. december 2004 - 15:41 #18
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester