Laden...

Timer & Tastendrucksimulation

Letzter Beitrag vor 15 Jahren 7 Posts 1.949 Views
Timer & Tastendrucksimulation

Hallo!

Ich möchte für ein Spiel ein Autosave erstellen. Es soll mit nach einer durch Up-Down-Boxen variablen Zeit F5 drücken. GUI hab ich natürlich schon, aber ich weiß nicht wie ich die Sache mit dem Timer und dem Tastendruck realisieren kann.

Noch eine allgemeine Frage (Anfänger in C#): Wie krieg ich denn Befehle raus ohne gleich alles nachschlagen zu müssen? Ich habe mit AutoIt (Basic-ähnlich) angefangen, dort konnte man sich alles herleiten. Z.B. habe ich versucht, mir den Befehl für Ausführen herzuleiten (System.Execute versucht). Muss man da immer in der Hilfe wühlen?

DarkOppa

Hallo DarkOppa,

SendKeys-Klasse

In C# ist es wie bei AutoIt. Wenn man sich erstmal erstmal ein bisschen eingefuchst hat, dann kann man sich die Sachen auch herleiten.

Siehe auch Anfänger und die MSDN-Doku - Ein Widerspruch?

herbivore

Hey,

danke für die schnelle Antwort! Wie würdest du denn vorgehen wenn du einen Befehl wissen wolltest? Ich hab im MSDN sowie in der C#-Hilfe von Visual Studio nach "ausführen" gesucht aber habe nichts relevantes gefunden.

Ist eigentlich die Sache mit dem Timer in System.Timers? Mit welchem Befehl starte ich dann die Zeitaufnahme welcher liefert mir die verstrichene Zeit zurück?

DarkOppa

Hallo DarkOppa,

Wie würdest du denn vorgehen wenn du einen Befehl wissen wolltest?

den Klassen- und/oder Methodennamen in den Index der MSDN-Doku eingeben. Siehe auch :rtfm:.

Ich hab im MSDN sowie in der C#-Hilfe von Visual Studio nach "ausführen" gesucht aber habe nichts relevantes gefunden.

An dem Punkt bist du ja nun schon vorbei, weil du durch mich ja, den Klassennamen kennst. 🙂 Aber ich finde es nicht abwegig, wenn man Tasten senden will, dass man dann von alleine auf SendKeys kommt.

Ist eigentlich die Sache mit dem Timer in System.Timers?

Auch da guckst du in die :rtfm: Doku.

Mit welchem Befehl starte ich dann die Zeitaufnahme

Auch da finde ich es nicht abwegig, auf Timer.Start zu kommen.

welcher liefert mir die verstrichene Zeit zurück?

Gar keiner. Das ist nicht der Sinn eines Timers. Wenn du die verstrichene Zeit wissen willst, dann verwende die Stopwatch-Klasse.

herbivore

Okay, die Stopwatch klappt. Hab jetzt aber Probleme mit der If-Abfrage wenn die eingestellte Zeit erreicht ist:

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void run_Click(object sender, EventArgs e)
        {
            this.run.Text = "Autosave stoppen";
            this.MinutesUpDown.Enabled = false;
            this.SecondsUpDown.Enabled = false;
            
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();

            while (true)
            {
                TimeSpan ts = stopWatch.Elapsed;
                string elapsedTime = String.Format("{1:00}",
                //string elapsedTime = String.Format("{1:00}.{2:00}",
                    ts.Hours, ts.Minutes, ts.Seconds,
                    ts.Milliseconds / 10);

                if (elapsedTime == MinutesUpDown.Value | elapsedTime > MinutesUpDown.Value) 
                {
                    SendKeys.Send("{F5}");
                    stopWatch.Stop();
                    stopWatch.Start();
                }
                Application.DoEvents();
                System.Threading.Thread.Sleep(30);
            }
        }
    }
}

Bekomme hier Fehler, dass ich die Operatoren "==" und ">" nicht auf Operanden vom Typ "string" und "decimal" anwenden kann. Wollte dann einfach umwandeln aber das geht ja auch nicht... Was kann man da machen?

DarkOppa

Hallo DarkOppa,

Okay, die Stopwatch klappt. Hab jetzt aber Probleme mit der If-Abfrage wenn die eingestellte Zeit erreicht ist:

Das ist nicht der Sinn der Stopwatch-Klasse. Wenn du eine Aktion zu einer oder nach einer bestimmten Zeit durchführen willst oder auch nur wissen willst - also benachrichtigst werden willst -, wenn eine bestimmte Zeit erreicht ist, verwende die Timer-Klasse.

herbivore

Ist zwar schon etwas alt der Thread aber ich poste meinen Lösungsvorschlag trotzdem.

Würde zur Auswahl der Zeit einen DateTimePicker nehmen und dessen Wert mit dem Timespan vergleichen. In etwa so:


if (ts > myDtpTimetillsave.Value.TimeOfDay)

Davon abgesehn ist aber folgendes:


Application.DoEvents();
System.Threading.Thread.Sleep(30);

nicht empfehlenswert und deswegen ein Timer doch wohl die bessere Lösung