Avatar billede blim Nybegynder
20. maj 2003 - 10:53 Der er 11 kommentarer og
1 løsning

Lukke et program vha Lingo

Hej
Jeg har i meget lang tid nu forsøgt at lukke et program indenfra et andet program vha Buddy API Xtra'en... men den vil have et winhandle at lukke!

Det jeg skal gøre er at når man klikker på en knap skal den åbne et program som brugeren vælger, det går også godt nok, men så skal jeg også få programmet til at lukke det program igen, hvordan finder jeg ud af hvilket Winhandle det program brugeren har åbnet er? For det er åbenbart et winhandle Buddy API vil lukke! :(

Selvfølgelig hvis der er andre metoder så bruger jeg dem :)
Avatar billede kanding Nybegynder
20. maj 2003 - 11:45 #1
Du ved jo hvilken application du har åbnet. Du kan søge på winhandle via Buddy med: baFindWindow(). Den tager 2 parametre, enten navnet du åbnede med eller vinduets titel. Når du har den kan du lukke den med baCloseApp()

fx. winHandle = baFindWindow("", "Notepad")
if winHandle  <> 0 then
baCloseApp(winHandle)
end if
Avatar billede blim Nybegynder
20. maj 2003 - 16:06 #2
Jaa... den havde jeg nu luret...
Vi taler her om et menu-program.
og husk at personen der har åbnet programmet indefra menuen kan jo ikke på forhånd have programmeret det ind i menu-programmet. Det jeg søger er en metode hvor computeren selv finder ud af hvilket winhandle der tilhører den fil som bliver åbnet... get it? :)
Avatar billede kanding Nybegynder
20. maj 2003 - 16:50 #3
Men er det ikke dig der laver menu'en, enten med faste programmer eller dynamisk? Så snart bruger klikker på et menupunkt og launcher et program, så gemmer du navnet så du kan søge efter det senere.
Evt. kan du også bruge baSetWindowTitle() til at kalde den noget unikt du kan søge på med baFindWindow("Notepad åbnet med lingo", "")
Avatar billede kanding Nybegynder
20. maj 2003 - 17:17 #4
skal ud af døren, men prøv dette tiol at tjekke alle windows.
on getWinNames
  fileList = [:]
  winList = baWindowList( "" , "" , false )
 
  repeat with i in winList
    fileList.addProp(i, baWindowInfo( i, "text" ))
  end repeat
  return fileList
end
Avatar billede blim Nybegynder
21. maj 2003 - 00:37 #5
John alt det her er rigtigt nok og smart... men jeg vil gerne have at folk SELV skal kunne klikke på "kør program", også de vælger en tilfældig fil, og computeren så selv finder ud af hvilket nr (winhandle) det program har... det er her mit problem ligger :)
Avatar billede blim Nybegynder
21. maj 2003 - 00:43 #6
En anden løsning ville faktisk være at kunne åbne et program, også fortælle computeren at det nye vindue der åbnes skal hedde f.eks. "Prog 1" istedet for "notepad" eller hva det nu hedder...
Avatar billede kanding Nybegynder
21. maj 2003 - 08:40 #7
Der er en ting ved din app. jeg ikke helt forstår:
Har du genereret en liste med tilfældige filer eller browser bruger sin computer. Men lige meget hvad, så må du kunne søge på det navn du startede programmet med når du laver baRunProgram().

ellers prøv det her:

global gActiveWindow

on run prg, _state
  baRunProgram( prg, _state, false )
  timeout("getActive").new(1, #getActiveWindow)
end

on getActiveWindow
  win = baActiveWindow()
  if win <> baWinHandle() and win <> 0 then
    timeout("getActive").forget()
    _list = getWinNames()
   
    ant = _list.count
    repeat with r = 1 to ant
      if _list.getPropAt(r) = win then
        gActiveWindow = _list[r]
        return
      end if
    end repeat
    gActiveWindow =  -1
  end if
 
end

on getWinNames
  fileList = [:]
  winList = baWindowList( "" , "" , false )
 
  repeat with i in winList
    fileList.addProp(i, baWindowInfo( i, "text" ))
  end repeat
  return fileList
end
Avatar billede blim Nybegynder
21. maj 2003 - 11:36 #8
hmm... nogle enkelte comments ville ikke være helt i vejen i dine lidt indviklede scripts :D

Men jeg har nogenlunde forstået ideen... tak!
Avatar billede kanding Nybegynder
21. maj 2003 - 14:28 #9
Først åbner jeg et program
så starter jeg et timeOut object, der hvert millisecond kører handleren getActiveWindow
I den handler tester jeg på activeWindow som IKKE må være projectoren selv og IKKE må være 0.
Hvis begge er sande sammenligner jeg alle navne i windowslisten med variablen win

virker det efter hensigten ???
Avatar billede blim Nybegynder
21. maj 2003 - 14:56 #10
øhm... ja altså...
det jeg ikke forstår er hvorfor du ikke kunne nøjes med :

on CloseApp
winhandle = baActiveWindow()
baCloseWindow( WinHandle )
end

Simpelt... og virker efter hensigten :)
Avatar billede kanding Nybegynder
21. maj 2003 - 17:03 #11
Du ville jo gemme det program bruger åbnede, så du kunne referere til det senere ikke?
Der kan være forsinkelse på focus af vinduet når det åbnes og så vil baActiveWindow() være 0, hvis der spørges lige efter. Hvis det nederste er fyldestgørende så er det fint, men hvornår og hvordan kaldes CloseApp??? Hvad sker der hvis bruger lukker vinduet selv??
Hmmm.. det kan være at jeg ikke fuldstændig har forstået opgaven ;-)
Avatar billede blim Nybegynder
21. maj 2003 - 22:22 #12
Jamen det er det fede ved det John... Hvis brugeren lukker det selv sker der ikke noget ved baCloseWindow! Den returnere bare et 0 ! :D
Desuden er det jo ligemeget om det er i starten eller til sidst at den tjekker programmet... Jeg glemte i øvrigt at sige at det er et spil, og ikke et program brugeren starter! Dermed er det kun 1 vindue som kører fuld skærm :)
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