Just nu i M3-nätverket
Gå till innehåll

Nybörjarguide för att styra andra program


StaffSa

Rekommendera Poster

Jag har nyligen börjat med C# som är mitt första språk. Målet är att göra ett program som automatiserar alla de steg som jag ofta gör på datorn. Jag har gått igenom guiden på denna sida: http://www.homeandle...arp/csharp.html, så nu kan jag flytta runt på text och räkna. Steget från att enbart jobba med text till att faktiskt styra ett annat program verkar stort. Det känns som om guiden inte ens har varit i närheten av något annat än textbehandling. När jag söker på hur jag ska göra på internett hittar jag olika metoder för hur det kan göras, men alla innebär att man bör ha lite större grundkunskap än vad jag har fått från guiden som jag har nämnt. Är det någon som har förslag på var jag hittar en nybörjarguide som leder mig mot målet?

Länk till kommentar
Dela på andra webbplatser

Att styra andra program kan vara lite speciellt. Många program har inte några enkla metoder för att styra dem. När man programmerar så använder man gärna API, det står för Application Programming Interface alternativt Application Programmers Interface beroende på vem man frågar. Det används för att hämta in funktionalitet i ditt program som du annars hade varit tvungen att skriva helt själv från början. I stort sett hela .NET Framework kan liknas vid ett API. Det är massor av färdigbyggda klasser och metoder du kan använda, jämförelsen är inte helt exakt men jag tror den är tillräcklig för denna förklaring.

 

När man styr andra program så kan man använda något som liknar ett API, även om jag tror i vissa fall kallar man det inte för API men jag är inte helt säker på den saken. Men det förutsätter att programmakaren gjort ett API eller gränssnitt för styrning.

 

Microsoft släppte för tre-fyra år sedan ett program som heter Powershell. Det är en ny kommandoprompt som är till för att automatisera steg man ofta gör på sin dator (känns ändamålet igen?). Powershell använder .NET och kan jämföras med C#. Du kan uppnå exakt samma resultat med C# som du kan med Powershell, den enda skillnaden är att man har strömlinjeformat Powershell för att skicka in kommandon och data till olika program och tjänster.

 

Microsoft har också skapat speciella Powershellkommandon för SQL-Server och Exchange eftersom administratörerna för dessa produkter var de som tjatade mest på att få denna typ av automatisering. Nackdelen är att om dessa kommandon inte finns i en produkt så kan det bli väldigt knepigt att styra ett program. Tillexempel har programmet ett COM-Interface? COM i det här fallet är en metod för att få program och tjänster i datorn att prata med varandra. Den var nog mer populär innan .NET eller åtminståne så marknadsförde Microsoft den betydligt mer innan .NET. Om du kan använda COM så skulle jag nog rekomendera att du använder C# för att prata med dessa komponenter. Det går lika bra att göra i Powershell, men jag tycker det är enklare i C#.

 

Om det varken finns .NET, Powershellkommandon eller COM kommandon i programmet så kan man prova att prata direkt med DLL-Filerna i programmet. Beroende på hur programmet är skrivet så kan man i C# berätta att man vill använda funktionalitet direkt i en DLL-fil. Detta är inte speciellt enkelt, speciellt inte om du inte vet exakt vilka metoder som finns där. Du kanske måste någon slags reverse engineering på filen för att få reda på detta.

 

I västa fall om inget av stegen ovan faktiskt fungerar, då får du prata Windows API och det gör man helt enkelt så att man säger åt windows att flytta muspekaren till en viss plats, säg åt Windows att klicka med musen osv osv. Massor av olika spännande fel kan uppstå i detta fall som att ett fönster inte ligger där man förväntar sig eller liknande. Plus att risken är att du inte kommer kunna göra något annat på datorn under tiden.

 

Med viss reservation så kan jag ha missat något eller helt enkelt missuppfattat styrning av program. Men när man skriver ett program så måste man inte öppna för styrning av det annat än med mus och tangentbord.

 

Vad är det egentligen du vill automatisera? Det kanske är så enkelt att det är några hyfsat vanliga tjänster som folk här på eforum snabbt kan hjälpa till med.

Länk till kommentar
Dela på andra webbplatser

Tack för en långt och fylligt svar. När jag får mer tid ska jag sätta mig in mer i de olika metoderna du nämner och se vilka som fungerar till de program jag tänkt använda.

Jag har en lång lista med saker som jag skulle vilja automatisera, framför allt inom bildbehandling i Photoshop Elements. Meningen är inte bara att spara tid när jag jobbar vid datorn, men också att ha roligt på vägen, så jag ska nog inte be om att andra gör jobbet åt mig.

Länk till kommentar
Dela på andra webbplatser

"Riktiga" Photoshop har en batchfunktion där man kan peka det mot en katalog med bilder och photoshop kommer utföra samma operation på alla bilder. Tillexempel applicera skärpa och beskära bilderna.

 

Elements kanske har en sådan funktion och med lite tur så kan du styra den ifrån kommandoprompten tillexempel. Då kommer du bli klar med dit projekt i ett nafs.

Länk till kommentar
Dela på andra webbplatser

Du måste väl börja med ett litet program.

Här är en bra början.

 

 

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Text;
using System.Diagnostics;




private void button1_Click(object sender, System.EventArgs e) 

  { 
                Process xxx;
   OpenFileDialog dlg = new OpenFileDialog(); 

   dlg.Title = "Open text file" ; 

   dlg.InitialDirectory = @"c:\" ; 

   dlg.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ; 

               if(dlg.ShowDialog() == DialogResult.OK) 

   { 
   xxx = Process.Start(dlg.FileName); 
    }           
   }

 

 

Länk till kommentar
Dela på andra webbplatser

Det här är bra att börja med.

 

 

private void button1_Click(object sender, System.EventArgs e)
 {
  System.Diagnostics.Process.Start("notepad.exe"); 
 }

Länk till kommentar
Dela på andra webbplatser

wordpad

 

 

private void button1_Click(object sender, System.EventArgs e)
 {


   System.Diagnostics.Process p =
    System.Diagnostics.Process.Start("notepad.exe");

   p.EnableRaisingEvents = true;

   p.Exited += new EventHandler(p_Exited);
  }

 private void p_Exited(object sender, EventArgs e)
 {
  if (MessageBox.Show ("Vill du öppna Wordpad", "My Application", 
   MessageBoxButtons.YesNo, MessageBoxIcon.Question)
   == DialogResult.Yes) 
  {
   System.Diagnostics.Process p =
    System.Diagnostics.Process.Start("wordpad.exe");
  }           
 }

 

 

Länk till kommentar
Dela på andra webbplatser

Batch går inte, en del av det jag hade tänkt att göra ska genomföras i olika program.

 

Att öppna ett program har jag lärt mig, det ingår i grundkurser. Jag upplever det som att de flesta beskrivningar av hur man ska starta med C# innehållet samma saker. Därefter finns det inga enkla guider för att ta sig vidare, i alla fall inga som ser ut att leda åt det hållet jag vill. Vi kan fortsätta med exemplet med notepad. Genom att klicka på knappen i mitt program öppnas notepad. Hur gör jag sedan för att programet i tillägg ska välja något från menyn.

Länk till kommentar
Dela på andra webbplatser

Generellt kan man nog säga att program som Elements inte har ett öppet API som du kan styra programmet genom.

Program som Word, Access, Excel, kontorsprogram/system är det vanligare i.

 

De APIer som kan finnas tillgängliga i programvaror som Elements, Picasa och liknande är nog snarare begränsade plugin-apier om det finns några, dvs APIer som medger utökning av programmen, inte styrning.

 

Vill du kunna automatisera misstänker jag att du måste gå upp i prisklass på program du vill styra. Enda som går är nog annars att använda Windows API som medger att du startar och stänger program eller kanske emulerar knapptryckningar. Mycket otympligt, du vet exempelvis inte när en viss process är klar, när applikationen är redo för nästa kommando.

 

Men men, du kan alltid testa att registrera en exe, en DLL, en COM-fil i ett .Net projekt och se om några funktioner finns tillgängliga.

Länk till kommentar
Dela på andra webbplatser

Att styra datorn med C# kan du glömma.

Från början trodde jag samma, men C# är

så bundet till "sig själv" så man blir förvånad.

Hade problem med att förstå att C# var så enbent.

Under en knapp kan programmet öppna annat

eller skriva till filer eller läsa. Men det är omöjligt

att komma vidare för att man är låst i C# - slingan.

Det förstod jag aldrig.

Länk till kommentar
Dela på andra webbplatser

Simkort, tagga ner lite, du har inte svar på allt, även om jag vet att du tycker om att tro det.

 

Det är förvisso sant att man inte kan styra andra program annat än antingen genom deras egna API:n eller genom att gå ner och anropa Win32-metoder i operativet för att sända meddelanden på os-nivå, men den begränsningen gäller för ALLA högnivåspråk och har verkligen inget med några begränsningar i C# att göra.

 

Dessutom har språket inget med saken att göra, det handlar om vilka ramverk som används. När det gäller C# på Windows och ramverket .Net så är det mer lämpat för detta eftersom det finns förenklat stöd att anropa native Win32-metoder i .Net. I Java får du jobba hårt för att hitta bra bibliotek för detta.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...