Avatar billede mbpedersen Nybegynder
21. februar 2005 - 17:22 Der er 13 kommentarer og
1 løsning

Shell og explorer

Fra access ønsker jeg at aktivere explorer og udføre en række tastetryk for til sidst, at afslutte explorer og vende tilbage til access.

Jeg har skrevet følgende kode:
Public Sub stifinder()
Dim ReturnValue
ReturnValue = Shell("Explorer.exe", 1)
AppActivate ReturnValue
.....
End sub

Men det går tilsyneladende galt, når der er tale om explorer. Her får jeg får en fejl 5 - Word og Excel virker OK med dette kald.

ReturnValue burde fungere, fordi den giver id'en tilbage og da den er unik - skulle det være perfekt. Da det nu ikke virker, har jeg forsøgt, at skrive: AppActivate "My Computer" som er title på Explorer, men den godtages heller ikke. Findes der en løsning på dette?

Jeg skriver programmet i Access97 på en Win2000.
Avatar billede -anders- Juniormester
21. februar 2005 - 21:13 #1
Hej på denne url http://www.nyholm.dk/makeiteasy/Home.asp?ContentID=39 er der et fremragende eks. på hvordan man kan aktivere programmer via Shell, prøv evt. at chekke det ud.
21. februar 2005 - 21:30 #2
Godt link, Anders :o)

Prøv også at kigge på IsAppRunning og ShowClassnames her: http://www.makeiteasy.dk/eksempler/VBFunktioner.htm

Bortset fra det, så ville jeg nok gribe det lidt anderledes an. Jeg ville i stedet lave en reference "Microsoft Internet controls" og derefter styre applikationen således:

Public Function Browse()
    Dim IE As New InternetExplorer
    IE.Navigate2 "http://www.makeiteasy.dk"
    IE.Visible = True
    IE.Quit
End Function
Avatar billede madschristensen Nybegynder
22. februar 2005 - 08:40 #3
Husk at shell som udgangspunkt er asynkront. Hvis du vil have din vba kode til at vente på, at nogle tastetryk bliver færdige, skal du kalde shell synkront. Hvis du har behov for dette må du lige sige til!.
Avatar billede mbpedersen Nybegynder
22. februar 2005 - 08:52 #4
Indtil videre - tak for svarene. Jeg vil arbejde videre med dem, og så vender jeg tilbage med kommentarer. Mads, du må gerne vise, hvordan du kalder shell synkront.
Avatar billede madschristensen Nybegynder
22. februar 2005 - 09:15 #5
Jeg har lige et møde, jeg vender tilbage ved middagstid.
Avatar billede mbpedersen Nybegynder
22. februar 2005 - 10:16 #6
OK - nu har jeg prøvet mig frem på en access xp. Jeg har taget en kopi fra makeiteasy via dit link aandersen. Jeg har kaldt funktionerne i en sub, således:

Public Sub stifinder()
Call ShellExecute("C:\TEMP\", WIN_NORMAL)
SendKeys "%D"
End Sub

Men beklageligvis tabes fokus på Explorer på samme måde, som hvis jeg kalder Shell på almindelig vis - det betyder, at jeg ikke kan "fjernstyre" Explorer. Hvad der er mærkeligt ved situationen er, at følges eksemplet i hjælpemenuen, så er der ingen problemer med at fjernstyre calc.exe - men explorer...

Så har jeg prøvet dit eksempel Thomas - det virker perfekt, men det var Explorer jeg skulle have fat i, og jeg synes ikke den er tilgængelig ligesom Iexplorer...?

Jeg kan uddybe lidt her: Jeg har en mobilenhed, som jeg gerne vil have 2 filer (genereret i Access97) kopieret over på. Mobilenheden er ikke tilgængelig fra en commandoprompt, og som jeg ser det, er jeg nødt til at åbne explorer og sende en række tastesekvenser til explorer, som kan gøre jobbet.

Håber det kunne uddybe lidt.
Avatar billede madschristensen Nybegynder
22. februar 2005 - 11:52 #7
Jeps - prøv med dette

Modul:

Public Declare Function WaitForSingleObject Lib "kernel32" _
  (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Public Declare Function CloseHandle Lib "kernel32" _
  (ByVal hObject As Long) As Long
 
Public Declare Function OpenProcess Lib "kernel32" _
  (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
    ByVal dwProcessId As Long) As Long


Public Const INFINITE = -1&
Public Const SYNCHRONIZE = &H100000

Dim ansv
Dim Shell_Line As String
Shell_Line = "C:\programmer\ibm\personal communications\receive.exe "
    Dim iTask As Long, ret As Long, pHandle As Long
    iTask = Shell(Shell_Line, vbNormalFocus)
    pHandle = OpenProcess(SYNCHRONIZE, False, iTask)
    ret = WaitForSingleObject(pHandle, INFINITE)
    ret = CloseHandle(pHandle)
Avatar billede madschristensen Nybegynder
22. februar 2005 - 12:00 #8
Ups - fra Dim ansv og nedefter er ikke modul, men derimod kaldet af shell...
Avatar billede mbpedersen Nybegynder
22. februar 2005 - 13:18 #9
Nu har jeg oprettet et modul, hvor Public Declare sætningerne ligger i General, Declarations. Så har jeg oprettet følgende sub:

Public Sub Stifinder()
Dim ansv
Dim Shell_Line As String
Shell_Line = "Explorer"
    Dim iTask As Long, ret As Long, pHandle As Long
    iTask = Shell(Shell_Line, vbNormalFocus)
    pHandle = OpenProcess(SYNCHRONIZE, False, iTask)
    SendKeys "{Down}"
    'ret = WaitForSingleObject(pHandle, INFINITE) 'Forsøgsvis udkommenteret
    'ret = CloseHandle(pHandle)
    'SendKeys "{Down}"
End Sub

Jeg har forsøgt, at sende tastetryk til explorer, men desværre med samme udfald som ved shellexecute og shell. Foreksempel sker der følgende, når jeg sender: Sendkeys "{Down}", at curseren går en linie ned i koden, så selv om explorer er tilgængelig/aktiv på skærmen, så udfører den koden som om, at det er access-modulet der er aktivt.
Avatar billede madschristensen Nybegynder
22. februar 2005 - 13:24 #10
Hvad skal du lave med explorer ?
Avatar billede mbpedersen Nybegynder
22. februar 2005 - 13:27 #11
Jeg skal flyttet 2 filer fra en pc over på en mobil-enhed.
Avatar billede madschristensen Nybegynder
22. februar 2005 - 13:30 #12
Kan du ikke bare gøre det med de indbyggede functioner i vba?
Avatar billede mbpedersen Nybegynder
22. februar 2005 - 14:18 #13
Muligvis - du må gerne skrive hvordan - men jeg kan ikke se mobil enheden. Det kan jeg fra explorer. Hvis jeg foreksempel bliver i shell, så er det heller ikke muligt, at skrive: Call Shell("Explorer.exe \Mobile Device", 1). Men går jeg i adresselinien og skriver: Mobile Device - så er der ikke noget problem. Jeg kan sidestille det med, at forsøge med call shell("Explorer.exe \My computer",1). Her kommer der en fejlmeddelelse, som korrekt oplyser om, at dette ikke er en mappe. Men hvis jeg kan tilgå enheden i vba - så er det absolut en bedre løsning, men så kunne jeg godt tænke mig at se, hvordan det skal gøres, for jeg ved ikke hvordan.
Avatar billede mbpedersen Nybegynder
09. marts 2005 - 21:12 #14
Ingen løsning fundet. Spørgsmålet lukkes hermed.
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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