08. december 2008 - 15:38Der er
37 kommentarer og 1 løsning
Forskellige spørgsmål i forbindelse med program til fjernkontrol
Hej eksperter,
Jeg overvejer i øjeblikket at skrive et simpelt program til fjernkontrol af min computers uTorrent-downloading. Applikationen skal kunne starte og stoppe programmet og styres fra et webbrowser, hvorfor der er en del ting, jeg først skal have styr på.
At starte uTorrent er enkelt nok - jeg kører bare applikationen.
At slukke uTorrent er lidt mere avanceret. Hvordan kan jeg sende en tastekombination til et program? F.eks. Alt+F > Pil op > Enter for bede uTorrent lukke.
Kommunikationen mellem webside og C#-applikationen er også lidt tricky. Jeg forventer ikke at lade C#-delen køre som service men derimod en almindelig enkeltstående eksekverbar fil. Hvordan kan jeg lettest kommunikere mellem HTML/PHP og C#?
Måske der ikke er noget jeg ved ... men hvordan vil du oprette en forbindelse til din PC bag din router uden at forward porte ? Hvis det skal kunne lade sig gøre skal vi jo igennem en 3parts server for at få det til at virke ... Men måske der er noget jeg ikke ved, så må du da gerne forklare hvordan du vil få det til at virke ... så kan jeg også lære noget :-)
Ja, du skal selvf bruge den port som du opsætter der webinterface til at bruge for at det virker.
// ouyT
Synes godt om
Slettet bruger
08. december 2008 - 22:05#6
Okay, skønt.
Tja, oprindeligt tænkte jeg et tredelt system.
Pc - uTorrent - C#-applikation
Server - Hjemmeside
Client - Bruger
Bruger > [Browser] > Hjemmeside > [Mail eller lignende beskedsystem] > Applikation > [Kommandoer] > uTorrent
For at gøre det helt klart (for jeg har nok bare forvirret dig so far!): Hjemmesidens PHP-del sender mails eller lignende, som applikationen konstant venter på og læser. Så fortolkes indholdet af beskeden, og de nødvendige kommandoer sendes videre til uTorrent. Det behøves ingen output (altså tilbagesending af informationer til brugeren) være, da de eneste to funktioner på siden skal være:
Pause download Fortsæt download
Meget enkelt :) Giver det mening, og kan det virke i praksis?
Tror der ville være for mange fejl kilder i sådan noget, og som jeg næsten kan høre på det er det ikke noget du har erfaring med at lave komplicerede apps ... har jeg heller ikke, så jeg ville mene det du har nævnt der er ikke helt lige til.
Men som jeg forstår det ... vil du lade din C# app poll en Mailserver ... for nye commands den skal udføre ....
En hjemmeside hvor du kan logge ind ... og sende mails til den mail konto som din C# app poll hele tiden ...
Hmmmm ... ville nu stadig lave det med noget port forward.
// ouT
Synes godt om
Slettet bruger
09. december 2008 - 07:12#8
Tja, men det der allerede er lavet, kan vel ikke begrænses til start og stop? Det skal nemlig ikke bruges til mig selv med derimod husets øvrige beboere... De klager nemlig over, at min pc sluger hele nettet, når den downloader ;) Og så er det jo lettest, hvis de bare kan pause skidtet, når de logger på.
Hvis det skal bruges internt er det vel heller ikke noget problem at bruge det webinterface ... så skal der jo ikke rdr nogen porte ...
Og jeg er da ret sikker på at man kan pause alle downloads derfra ...
// ouT
Synes godt om
Slettet bruger
09. december 2008 - 12:34#10
Jamen jeg mener, at de øvrige brugere f.eks. ikke må kunne se eller ændre, hvad der downloades... De må overhovedet ikke kunne gøre andet end at starte og stoppe programmet.
Nu er du ved at have forklaret hvad det egentlig er du vil ...
Men det er noget af et projekt du er ved at kaste dig ud i ... er det ikke nemmere bare at sætte up/down limits på ... i bestemte perioder af døgnet ... og resten af det, sørger du bare for ikke at bruge hele jeres båndbredde ... nok nemmere løsning.
Det andet er nok lidt kompliceret.
Men jeg ville nok lave en socket server ... og så lade den køre på din computer ... så burde det være nemt at slå processen "utorrent.exe" ned ... og så starte den igen senere ...
// ouT
Synes godt om
Slettet bruger
09. december 2008 - 13:11#12
Jeg har ingen anelse om, hvad en socket server er men har en god idé til en anden løsning. Jeg skriver lige tilbage, når jeg har prøvet det.
det virker da godt nok som en usædvanlig bøvlet løsning med at lade en C# applikation "polle" en mail inbox.. hvorfor ikke bare expose en webservice fra den server hjemme siden kører på ?
Synes godt om
Slettet bruger
09. december 2008 - 14:58#14
Fordi hjemmesiden ligger på et webhotel.
Synes godt om
Slettet bruger
09. december 2008 - 14:59#15
Nøj, hvor er det irriterende, at Eksperten er begyndt først at sende mails ud om nye kommentarer efter 45 minutter!
og nej ... exp sender da ud hele tiden ... mine mails vælter da ind.
Synes godt om
Slettet bruger
09. december 2008 - 15:20#18
Det varierer meget. Jeg har f.eks. allerede fire minutter efter din sidste besked modtaget en mail, mens mails nogen gange aldrig dukker op eller er op til en time forsinkede.
Du kunne også hoste en WCF webservice i en service på den computer der kører utorrent, og så forwarde porten i routeren til den, så skal du bare have en client app til at styre det
Synes godt om
Slettet bruger
09. december 2008 - 15:52#20
Jeps. Jeg vil bare helst undgå services, da jeg hverken har erfaring med dem eller et environment der er behjælpeligt med dem (bruger VC#08EE).
det er fordi du skal have det vindue i fokus som du skal sende tastetryk til, det kan du gøre sådan her
using System; using System.Windows.Forms; using System.Runtime.InteropServices;
namespace test { class Program { [DllImport("User32.dll")] public static extern Int32 SetForegroundWindow(int hWnd); [DllImport("user32.dll")] public static extern int FindWindow(string lpClassName, string lpWindowName); static void Main(string[] args) { int handle = FindWindow("notepad", null);//find vinduet med titlen notepad SetForegroundWindow(handle); //sæt det i fokus SendKeys.SendWait("%({F4})"); //send dine tastetryk, i det her tilfælde ALT+F4
} } }
Synes godt om
Slettet bruger
13. december 2008 - 10:59#24
Smukt :) Tak.
Synes godt om
Slettet bruger
13. december 2008 - 11:35#25
Igen besluttede Eksperten sig for at slette min post. Lige et sekund...
Error 1 The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?) Client.cs 17 10 uControl Error 2 The type or namespace name 'DllImportAttribute' could not be found (are you missing a using directive or an assembly reference?) Client.cs 17 10 uControl Error 3 The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?) Client.cs 19 10 uControl Error 4 The type or namespace name 'DllImportAttribute' could not be found (are you missing a using directive or an assembly reference?) Client.cs 19 10 uControl
Kompileringsfejlene står ovenfor... Men for god ordens skyld:
Error 1 The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?) Client.cs 17 10 uControl Error 2 The type or namespace name 'DllImportAttribute' could not be found (are you missing a using directive or an assembly reference?) Client.cs 17 10 uControl Error 3 The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?) Client.cs 19 10 uControl Error 4 The type or namespace name 'DllImportAttribute' could not be found (are you missing a using directive or an assembly reference?) Client.cs 19 10 uControl
Fejlene opstår, når jeg anvender koden Sphinx postede... Igen for god ordens skyld:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
using System.Diagnostics; using System.Windows.Forms; using System.Runtime.InteropServices; // Necessary?
namespace uControl { static class Client { public static string WindowText = "μTorrent 1.8.1";
public static string User;
[DllImport("User32.dll")] public static extern int SetForegroundWindow(int hWnd); [DllImport("user32.dll")] public static extern int FindWindow(string lpClassName, string lpWindowName);
public static bool Start(int delay) { if (Test) { Write("* Unable to initiate uTorrent after " + (delay / 1000).ToString() + " seconds as the application is already running."); return false; } if (delay > 0) { Write("Waiting for " + (delay / 1000).ToString() + " seconds..."); System.Threading.Thread.Sleep(delay); } if (Test) { Write("* Unable to initiate uTorrent as the application is already running."); return false; } Write("Initiating uTorrent..."); System.Diagnostics.Process.Start(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\uTorrent\\uTorrent.exe"); Write("Waiting for 2 seconds..."); System.Threading.Thread.Sleep(2000); Write("Opening main uTorrent window..."); System.Diagnostics.Process.Start(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\uTorrent\\uTorrent.exe"); Write("Changing focus to main uTorrent window..."); Focus(); Write("Sending closing key combination to main uTorrent window..."); SendKeys.SendWait("%({F4})"); return true; }
public static bool Stop(int delay) { if (!Test) { Write("* Unable to terminate uTorrent after " + (delay / 1000).ToString() + " seconds as the application is not currently running."); return false; } if (delay > 0) { Write("Waiting for " + (delay / 1000).ToString() + " seconds..."); System.Threading.Thread.Sleep(delay); } if (Test) { Write("* Unable to initiate uTorrent as the application is already running."); return false; } Write("Opening main uTorrent window..."); System.Diagnostics.Process.Start(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\uTorrent\\uTorrent.exe"); Write("Changing focus to main uTorrent window..."); Focus(); Write("Sending termination key combination to main uTorrent window..."); SendKeys.SendWait("%(F)X"); return true; }
Et par spm: Du bruger en "Test" (nok en property) flere steder i den her kode ... uden jeg kan finde den. Alt er static ... lidt mærkeligt efter min mening ... fjern alle dine static keywords ... og opret en instance af din klasse i din kode og brug din funktioner derfra.
Jeg kan ikke lige helt gennemskue din kode ... synes der mangler en masse, den kan i hvert fald ikke compile på min computer.
// ouT
Synes godt om
Slettet bruger
15. december 2008 - 09:00#33
Well, det er tilladt at tænke selv ;) Test skulle være Test(), og med den rettelse fungerer skidtet sgu. Måske jeg også selv skulle have tænkt lidt, da jeg havde fire manglende ()-sæt til Test og fire kompileringsfejl af samme karakter... Hmm. User defineres eksternt men betyder ikke noget her. Jeg arbejder videre nu...
ja, det er tilladt tænke selv ... men håber da kommentar var til dig selv.
Jeg bad jo om at få sendt den kode som du prøvede at compile og hvis de fejl var i din kode, skulle du jo rette dem først ... ellers må jeg jo antage at du enten fjerner lidt kode for at jeg ikke kan se det hele.
Det er jo muligt både at have en Test og en Test() så ...
Men når du siger at du får følgende fejl: Error 1 The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?) Client.cs 17 10 uControl Error 2 The type or namespace name 'DllImportAttribute' could not be found (are you missing a using directive or an assembly reference?) Client.cs 17 10 uControl Error 3 The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?) Client.cs 19 10 uControl Error 4 The type or namespace name 'DllImportAttribute' could not be found (are you missing a using directive or an assembly reference?) Client.cs 19 10 uControl
Når du selv compiler ... og jeg får helt andre fejl ... så er det jo ik' nemt.
Men får du stadig compile fejl med at "DllImport" ikke kan findes ?
Synes godt om
Slettet bruger
15. december 2008 - 13:04#35
Nope, det fungerer nu. Jeg har også fået forbindelsen til PHP-scriptet til at virke, så jeg arbejdet selv videre med webdelen nu.
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.