21. februar 2005 - 17:22Der 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?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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
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!.
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.
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.
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)
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.
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.
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.