Da Autoit zu langsam ist, werden die Dateien mit Autoit erstellet und von einer C#-exe benutzt, um das auszuführen.
C#-Datei:
Spoiler anzeigen
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Timers;
using System.Diagnostics;
using Tim = System.Timers.Timer;
namespace Bildmaler
{
class Haupt
{
[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(int key);
[DllImport("user32.dll")]
public static extern bool InvalidateRect(IntPtr hwnd, IntPtr rect, bool erase);
//Für Interaktiv später
[DllImport("user32.dll")]
static extern bool GetCursorPos(out Point lpPoint);
public static short _ispressed(int key)
{
short a, k=0;
a = GetAsyncKeyState(key);
if (a == -32767) k = 1; //|| a == 1
return k;
}
public static int ticks;
public static void Main(string[] args)
{
string datei;
if (args.Length < 1)
{
datei = "tut.bt1"; //Dann ist Debug
if (!File.Exists(datei)) datei = "tut.bt2";
}
else
{
datei = args[0];
}
int sleep = 1;
string title = "";
string now = "";
if (!File.Exists(datei))
{
MessageBox.Show("Textdatei konnte nicht gefunden werden!", "Fehler");
return;
}
StreamReader file = new StreamReader(datei);
IntPtr hwnd = FindWindow(title); //IntPtr.Zero;
IntPtr dc = GetDC(hwnd);
Graphics desk = Graphics.FromHdc(dc);
Tim t = new Tim();
t.Elapsed += new ElapsedEventHandler(up);
int endit=0;
Point mouse = new Point();
int mode=0;
int xx=-1, yy=-1, ww=-1, hh=-1;
try
{
Image img;
Point p;
while (!file.EndOfStream)
{
now = file.ReadLine();
string[] split = now.Split(',');
if (split.Length < 4) throw new Exception("Die Zeile der Textdatei hat nicht genug Argumente!");
if (split.Length > 4)
{
if (split.Length < 9) throw new Exception("Anzahl der Parameter ungültig!");
mode = Convert.ToInt32(split[4]);
if (mode > 2) mode = 2;
xx = Convert.ToInt32(split[5]);
yy = Convert.ToInt32(split[6]);
ww = Convert.ToInt32(split[7]) + xx;
hh = Convert.ToInt32(split[8]) + yy;
}
else
{
mode = 0;
}
if (!File.Exists(split[0])) throw new Exception("Bilddatei nicht gefunden!");
img = Image.FromFile(split[0]);
p = new Point(Convert.ToInt32(split[1]), Convert.ToInt32(split[2]));
if (Convert.ToInt32(split[3]) != 0)
{
t.Interval = Convert.ToInt32(split[3]);
t.Start();
}
while (_ispressed(27) == 0 && endit == 0)
{
if (ticks == 1) endit = 1;
if (mode > 0)
{
GetCursorPos(out mouse);
if (mouse.X >= xx && mouse.Y >= yy && mouse.X <= ww && mouse.Y <= hh)
{
if (mode == 1) endit = 1;
if (mode == 2)
{
if (_ispressed(1) == 1) endit = 1;
}
}
}
desk.DrawImage(img, p);
Thread.Sleep(sleep);
}
endit = 0;
ticks = 0;
t.Stop();
img.Dispose();
InvalidateRect(IntPtr.Zero, IntPtr.Zero, true);
}
}
catch (Exception e)
{
//Console.WriteLine("Fehler/Error: " + e.Message);
MessageBox.Show(e.Message, "Fehler/Error");
}
file.Close();
file.Dispose();
desk.Dispose();
t.Dispose();
}
public static void up(object sender, ElapsedEventArgs e)
{
ticks = 1;
}
public static IntPtr FindWindow(string title)
{
if (title == "") return IntPtr.Zero;
Process[] tempProcesses;
tempProcesses = Process.GetProcesses();
foreach (Process proc in tempProcesses)
{
if (proc.MainWindowTitle == title)
{
return proc.MainWindowHandle;
}
}
return IntPtr.Zero;
}
}
}
Alles anzeigen
Autoit:
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=ICONS\x.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$BildTutorialCreater = GUICreate("BildTutorialCreater 2", 381, 351, 192, 124)
$List1 = GUICtrlCreateList("", 16, 128, 249, 201)
$Bild = GUICtrlCreateLabel("Bild: ", 16, 16, 245, 17)
$Button1 = GUICtrlCreateButton("Durchsuchen", 280, 8, 81, 25, $WS_GROUP)
$Input1 = GUICtrlCreateInput("10", 40, 48, 73, 21)
$X = GUICtrlCreateLabel("X: ", 16, 48, 11, 17)
$Y = GUICtrlCreateLabel("Y: ", 136, 48, 19, 17)
$Input2 = GUICtrlCreateInput("10", 168, 48, 73, 21)
$Input3 = GUICtrlCreateInput("5000", 136, 88, 89, 21)
$Zeit = GUICtrlCreateLabel("Zeit (in Millisekunden): ", 24, 88, 110, 17)
$Hinzu = GUICtrlCreateButton("Hinzufügen",270,300,100,25)
$Label1= GUICtrlCreateLabel("Maus:",270,88,50,12)
$inp1=GUICtrlCreateInput("0",270,110,100,25)
GUICtrlSetTip(-1,"Modus: 0=Maus egal, 1=Maus in Feld, 2=Klick in Feld")
$inp2=GUICtrlCreateInput("0",270,140,100,25)
GUICtrlSetTip(-1,"X-Koordinate des Bildschirms")
$inp3=GUICtrlCreateInput("0",270,180,100,25)
GUICtrlSetTip(-1,"Y-Koordinate des Bildschirms")
$inp4=GUICtrlCreateInput("0",270,220,100,25)
GUICtrlSetTip(-1,"Width des Feldes")
$inp5=GUICtrlCreateInput("0",270,260,100,25)
GUICtrlSetTip(-1,"Height des Feldes")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Global $file=""
Global $pres=""
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$file=FileOpenDialog("Bild suchen...","","Bilder(*.jpg;*.jpeg;*.png;*.bmp)|Alles(*.*)")
GUICtrlSetData($Bild,"Bild: "&$file)
Case $Hinzu
If $pres="" Then $pres=InputBox("Präsentation","Name der Vorstellung:")
if $file="" Then
MsgBox(0,"Achtung","Es wurde noch kein Bild ausgewählt")
ContinueCase
EndIf
if DirGetSize(@ScriptDir&"\"&$pres)<0 Then DirCreate(@ScriptDir&"\"&$pres)
FileInstall("Bildmaler.exe",@ScriptDir&"\"&$pres&"\")
$split=StringSplit($file,"\")
$bild=@ScriptDir&"\"&$pres&"\"&$split[UBound($split,1)-1]
FileCopy($file,$bild)
$mode=Int(GUICtrlRead($inp1))
$tx=Int(GUICtrlRead($inp2))
$ty=Int(GUICtrlRead($inp3))
$tw=Int(GUICtrlRead($inp4))
$th=Int(GUICtrlRead($inp5))
$feld=$tx&","&$ty&","&$tw&","&$th
$line=$bild&","&Int(GUICtrlRead($Input1))&","&Int(GUICtrlRead($Input2))&","&Int(GUICtrlRead($Input3))&","&$mode&","&$feld
FileWriteLine(@ScriptDir&"\"&$pres&"\tut.bt2",$line)
$line=$split[UBound($split,1)-1]&","&Int(GUICtrlRead($Input1))&","&Int(GUICtrlRead($Input2))&","&Int(GUICtrlRead($Input3))&","&$mode&","&$feld
GUICtrlSetData($List1,$line&"|")
EndSwitch
Sleep(10)
WEnd
Komplettdatei im Anhang, viel Spaß damit
Wünsche Kritik alles gerne
Also noch auf Aufforderung:
Der Creater erstellt Datien die die C#exe benutzt, genauer:
sie liest ein welches Bild genomen werden soll und zeichnet es so lange bis:
1. Timeout ist (Wenn ms-Zeit 0 ist gibt es kein Timeout) (Alle Modi)
2. Maus über dem gewählten Feld ist (Modus 1)
3. Auf ein gewähltes Feld geklickt wurde (Modus 2)
(Bei Modus 0 wird Maus ignoriert)
Dann kommt das nächste Bild, bis die Datei abgearbeitet wurde.
Die C# exe nimmt Standardmäßig tut.bt1, wenn nicht vorhanden tut.bt2, wenn nicht vorhanden Msgbox
Wenn ein Startparametergenommen wurde wird die Textdatei genommen