|
You last visited: Today at 00:25
Advertisement
CMD - Während Benutzereingabe Text hinzufügen
Discussion on CMD - Während Benutzereingabe Text hinzufügen within the AutoIt forum part of the Coders Den category.
08/20/2011, 20:39
|
#1
|
elite*gold: 0
Join Date: Jul 2010
Posts: 475
Received Thanks: 130
|
CMD - Während Benutzereingabe Text hinzufügen
Hey,
Ich möchte mit dem CMD eine Art Konsole für meinen Server machen. Im CMD sollen alle Ereignisse gezeigt werden und wenn der User was schreibt sollen bei bestimmten Texten Funktionen ausgeführt werden.
Hier meine Funktionen:
PHP Code:
Func CMDstart($ExitOnFatal = True) If Not _WinAPI_AttachConsole() Then $ret = DllCall("Kernel32.dll", "long", "AllocConsole") If $ret = 0 Then If $ExitOnFatal Then _WinAPI_FatalAppExit("Could not allocate Console") Return SetError(1, 0, 0) EndIf EndIf Global $GLOBAL_hConsole = _WinAPI_GetStdHandle(1) If $GLOBAL_hConsole = -1 Then If $ExitOnFatal Then _WinAPI_FatalAppExit("GetStdHandle for Output failed") Return SetError(2, 0, 0) EndIf Global $GLOBAL_hConsoleIn = _WinAPI_GetStdHandle(0) If $GLOBAL_hConsoleIn = -1 Then If $ExitOnFatal Then _WinAPI_FatalAppExit("GetStdHandle for Input failed") Return SetError(1, 0, 0) EndIf Return 1 EndFunc ;==>CMDstart
Func CMDpause() CMDread() EndFunc ;==>CMDpause
Func CMDclose() WinClose(@ScriptDir & "\" & @ScriptName) WinKill(@ScriptDir & "\" & @ScriptName) EndFunc ;==>CMDclose
Func CMDwrite($text) $text = $text & @CRLF Local $temp = _WinAPI_WriteConsole($GLOBAL_hConsole, CMDCharToOem($text)) Return SetError(@error, @extended, $temp) EndFunc ;==>CMDwrite
Func CMDread() Local $test = DllStructCreate("char[10000]") Local $read = 5000 Local $temp = _WinAPI_ReadFile($GLOBAL_hConsoleIn, DllStructGetPtr($test), DllStructGetSize($test), $read) If @error Then Return SetError(@error, @extended, $temp) Return CMDOemToChar(DllStructGetData($test, 1)) EndFunc ;==>_CMD_READ
Func CMDOemToChar($szSrc) Local $placeholder For $i = 0 To StringLen($szSrc) $placeholder &= " " Next Local $lRetVal = DllCall("user32.dll", "long", "OemToChar", "str", $szSrc, "str", $placeholder) If IsArray($lRetVal) And $lRetVal[0] = 1 Then Return SetError(0, 0, $lRetVal[2]) EndIf
Return SetError(1, 0, "") EndFunc ;==>OemToChar
Func CMDCharToOEM($szSrc) Local $placeholder For $i = 0 To StringLen($szSrc) $placeholder &= " " Next Local $lRetVal = DllCall("user32.dll", "long", "CharToOem", "str", $szSrc, "str", $placeholder) If IsArray($lRetVal) And $lRetVal[0] = 1 Then Return SetError(0, 0, $lRetVal[2]) EndIf
Return SetError(1, 0, "") EndFunc ;==>CharToOEM
Es funktioniert gut bis auf eine Macke:
Der User kann nur schreiben wenn CMDread ausgeführt wird, allerdings während dieser Befehl ausgeführt wird kann der Server nicht weiterlaufen was zu Laggs führt. Wenn CMDread jedoch nicht ausgeführt wird kann der User im CMD nicht schreiben ...
Hat jemand eine Lösung?
|
|
|
08/23/2011, 15:59
|
#2
|
elite*gold: 0
Join Date: Jan 2010
Posts: 360
Received Thanks: 249
|
warum baust du dir nicht einfach eine eigene konsole?
|
|
|
08/24/2011, 08:31
|
#3
|
elite*gold: 0
Join Date: Jul 2010
Posts: 475
Received Thanks: 130
|
Habe ich bereits, sie sieht nur etwas **** aus =)
Ich möchte nur auf sie zurückgreifen falls ich weder hier noch auf der deutschen Autoit Seite eine Lösung finde/bekomme.
|
|
|
08/24/2011, 10:49
|
#4
|
elite*gold: 0
Join Date: Jan 2010
Posts: 360
Received Thanks: 249
|
hm okay, verständlich ;-)
ich weiß nicht genau was du machen willst aber für konsolen anwendungen würde ich einfach mal spontan C# vorschlagen.
wenn es für dich nicht zu aufwändig ist (die basics sind ja nicht schwer) dann kannst du ja einfach deinen code kurz in c# implementieren.
ansonsten wüsste ich auch nicht genau wie das in autoit funktioniert.
ein beispiel würde so aussehen:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication
{
class Program
{
private static bool exit;
static void Main(string[] args)
{
Console.WriteLine("bla blub Server Konsole ;-)");
while (!exit)
{
switch (Console.ReadLine())
{
case "test":
Console.WriteLine("-> bla blub test cmd");
break;
case "exit":
exit = true;
break;
}
}
}
}
}
|
|
|
08/24/2011, 11:18
|
#5
|
elite*gold: 52
Join Date: Oct 2010
Posts: 1,998
Received Thanks: 389
|
Also ich würde es dir auch raten eine eigene Console zu bauen. Weil ob das sonst am ende wirklich leistungseffizient wird mag ich zu bezweifeln.
|
|
|
08/24/2011, 13:00
|
#6
|
elite*gold: 0
Join Date: Jul 2010
Posts: 475
Received Thanks: 130
|
@ZeraPain Okay danke.
Könntest du mir noch sagen wie man in c# in eine Ini-Datei schreibt und sie ausliest?
Ich habe vor ein Programm mit C# zu machen das eben nur die Konsole erstellt. Befehle/Eingaben sollen per Ini-datei weitergegeben werden ...
Edit: Gibt es einen alternativen Editor & Compiler zu Visual C# 2010 ? Meine 30 Tage Testversion ist
schon abgelaufen -.-
Edit2: Habe einen Compiler gefunden der sogar Platformunabhängigkeit verspricht! Das Prog läuft dann also auch auf Linux usw. Mal schauen ob der was taugt!
Edit3: Er taugt zwar was allerdings werden im mitgelieferten Editor keine Befehle vorgeschlagen was mir als Anfänger ziemlich fehlt.
Edit 4 =): Okay habe jetzt wieder Visual C#
Allerdings genau das selbe Problem: Bei dem Teil in deinem Programm wo das Programm auf eine eingabe wartet, sprich
PHP Code:
switch (Console.ReadLine())
Kann der Server nicht weiterlaufen/Kann das Programm nichts in die Konsole schreiben bis der User was eingegeben hat.
|
|
|
08/24/2011, 15:14
|
#7
|
elite*gold: 0
Join Date: Jan 2010
Posts: 360
Received Thanks: 249
|
Also eine ini kannst du z.b. so verwalten:
Code:
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace ZPBot.Common
{
class IniFile
{
private string path;
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,
string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,
string key, string def, StringBuilder retVal,
int size, string filePath);
public IniFile(string INIPath)
{
path = INIPath;
}
public void Write(string Section, string Key, string Value)
{
WritePrivateProfileString(Section, Key, Value, path);
}
public string Read(string Section, string Key)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section, Key, "", temp,
255, path);
return temp.ToString();
}
public bool Bool(string Section, string Key)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section, Key, "", temp,
255, path);
if (temp.ToString() == true.ToString())
return true;
else
return false;
}
public void RemoveSection(string pSection)
{
WritePrivateProfileString(pSection, null, null, path);
}
}
}
Quote:
Originally Posted by V8II
Edit 4 =): Okay habe jetzt wieder Visual C#
Allerdings genau das selbe Problem: Bei dem Teil in deinem Programm wo das Programm auf eine eingabe wartet, sprich
PHP Code:
switch (Console.ReadLine())
Kann der Server nicht weiterlaufen/Kann das Programm nichts in die Konsole schreiben bis der User was eingegeben hat.
|
das ist das gute an C#. da lässt sich leicht(er) abhilfe schaffen z.b. mit threads ;-)
wenn du willst kann ich dir das auch noch erklären.
ansonsten findest du bestimmt auch ein tutorial irgendwo
|
|
|
08/24/2011, 16:13
|
#8
|
elite*gold: 0
Join Date: Jul 2010
Posts: 475
Received Thanks: 130
|
Okay, ein fettes Dankeschön!
Wie "mache" ich jetzt am leichtesten einen 2ten. Thread? Habe bisschen gesucht aber grundlegend nur Bahnhof verstanden ...
|
|
|
08/24/2011, 16:43
|
#9
|
elite*gold: 1826
Join Date: Mar 2009
Posts: 4,310
Received Thanks: 6,283
|
|
|
|
08/24/2011, 16:58
|
#10
|
elite*gold: 0
Join Date: Jan 2010
Posts: 360
Received Thanks: 249
|
sowas z.b.
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication
{
class Program
{
private static bool exit;
private static Thread ConsoleInput;
static void Main(string[] args)
{
Console.WriteLine("bla blub Server Konsole ;-)");
ConsoleInput = new Thread(ReadConsoleInput);
ConsoleInput.Start();
while (!exit)
{
Console.WriteLine("Main Thread");
Thread.Sleep(2000);
}
}
private static void ReadConsoleInput()
{
while (!exit)
{
switch (Console.ReadLine())
{
case "test":
Console.WriteLine("-> bla blub test cmd");
break;
case "exit":
exit = true;
break;
}
}
}
}
}
|
|
|
|
Similar Threads
|
[Text-TuT] Client Text und Beschriftungen
09/19/2011 - Flyff Private Server - 6 Replies
Hey ElitePvPer's,
heute zeige ich euch;
- wie man den Text und/oder die Beschriftungen ingame ändert.
- Wie man die Farbe des Textes und/oder der Beschriftung ändert.
Wir öffnen zu erst die im Resource-Ordner enthaltene textclient.txt.txt.
Nehmen wir mal an wir möchten die Farbe und den Text von "Du hast XXX Penya erhalten (Gesamt: XXX Penya)" ändern.
Wir suchen dazu(+) in der textClient.txt.txt nach "Penya".
Direkt der 2te String ist es:
IDS_TEXTCLIENT_INC_000185 Du hast %s Penya...
|
[HOW-TO] Questbefehle für farbigen text hinzufügen
03/22/2011 - Metin2 PServer Guides & Strategies - 9 Replies
Tag Leute,
Ihr wisst ja, dass ihr in quests mit dem Befehl say() gräulichen Text an den User
ausgeben kann, und mit say_reward() roten. Ihr könnt solche Befehle hinzufügen, indem ihr einen Eintrag in der questlib.lua macht. Dieser kann beispielsweise so aussehen:
function say_blau(text) say(color256(56, 140, 244)..text..color256(196, 196, 196)) end
, wobei say_blau() meine neue Funktion ist, die den Text, den man ihr vorgibt in blau anzeigt. Die blaue Farbe ist im RGB Format vor dem...
|
[How to]Npc text hinzufügen
03/30/2010 - Metin2 Private Server - 7 Replies
Huhu ich weiß nich ob es sowas schon gibt also mach ichs einfach ma
Also ich will das bei einem NPC hinzufügen des normal nichts sagt
zB
http://www.imgbox.de/users/public/images/i46830w4 4.png
das nur bei Kriegergeist, der normal schweigt :)
1. FileZilla öffnen
2. Verbinden
3./usr/rain/channel/share_data/locale/hongkong/qu est
4. locale_big5.lua öffnen und bis zu dem scrollen
http://www.imgbox.de/users/public/thumbnails/k518 80z105_t.gif
|
Während Maintance in RO
07/18/2006 - RO Exploits, Hacks, Bots & Guides - 7 Replies
© by anonymous
Hi,
viele kennen das, ist grad Maintance auf euRO und man kommt nicht in RO rein, weil der Patchserver es nicht zulässt. Nungut, greifen halt viele zu einer Hexed Exe, allerdings haben die, die neusten Updates nicht und man weiß nicht ob man stecken bleibt oder was auch immer. Dabei gibt es aber eine ganz einfache Methode RO zu starten ohne den Patchserver zu umgehen - man braucht nichtmal ne Hexed Exe dafür. Ihr müsst einfach in euren RO Ordner die Datei...
|
All times are GMT +2. The time now is 00:25.
|
|