Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von herbivore
Thema: Zugriff auf PDF-Datei << welches Tool?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Maddinel,

ohne die eigentliche Frage beantworten zu können, kann ich sagen, dass PDF ein sehr mächtiges und damit komplexes Format ist. Die meisten PDF-Editoren beherschen deshalb auch nur ein Subset des Formats. Beliebige PDF-Dateien einzulesen ist daher sicher quasi unmöglich.

Außerdem ist PDF ein "Druckformat", bei dem es darum geht, die einzelnen Elemente auf einer Seite exakt anzuordnen. Dazu wird der ursprüngliche Fließtext, aus dem ja viele Dokumente bestehen, in einzelne Zeilen aufgespaltet und jede dieser Zeilen bildet ein einzelnes Element. Es ist also u.U. schon nicht ganz trivial, alleine die ursprünglichen Absätze im Text zu rekonstruieren.

Es mag aber sein, dass man für spezielle Anwendungsfälle paraktikable Lösungen realisieren kann.

HTH

herbivore

Thema: Ereignisse von anderen Programmen abfangen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo norman_timo,

Zitat
Meiner Meinung nach muss das dann auf Interrupt-Ebene (also schon fast hardwarenah) ausgeführt werden, damit auch Windows nicht zum reagieren kommt.

ich denke nicht, dass das ganz so schwierig und hardware-nah wird. Unter Verwendung globaler Hooks (per Win32, gibt's nicht direkt in .NET) kriegt man das schon hin. Ganz trivial wird das allerdings wirklich nicht. Man muss schon etwas mit Koordinaten rumrechnen, denn man muss auf Maus- und Keybord-Ebene arbeiten und nicht auf Ebene der Controls wie Button und Menüs. Die Forumsuche nach Hook sollte einiges zu Tage fördern.

HTH

herbivore

Thema: Gebäudeumriss und räume mit c# zeichnen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Rincewind,

Zitat
Ich bin was das Programieren angeht ein neuling

Dann kann ich Dir nur dringend ans Herz legen, nicht gleich mit einem 3D-Projekt anzufangen! Es gibt viele schöne andere Programmieraufgaben oder bleib mindestens bei 2D.

herbivore

Thema: Tastaturhook oder ähnliches?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo webby,

doch, man kann in C# mit DllImport auf Win32 durchgreifen. Ob das "ohne weiteres" geht, mag jeder selbst beurteilen. Solange die benötigte Funktion nur Integer-Werte oder Strings als Parameter benötigt, ist es m.E. wirklich ziemlich einfach. Wenn Strukturen oder Win32-spezifische Datentypen ins Spiel kommen, wird es tatsächlich etwas aufwändiger. Die Forumssuche nach DllImport dürfte einiges zu Tage fördern.

HTH

herbivore

Thema: Tastaturhook oder ähnliches?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo webby,

den Einwand bezüglich der Zwischenablage verstehe ich nicht. Es werden in diesem Modus ja eben keine Anschläge geschickt, sondern die Zwischenablage per API genutzt; das geht verzögerungsfrei.

Den Einwand mit OS/2 und C++ verstehe ich ebenfalls nicht, weil es hier ja um den Aufruf von Win32-APIs geht und die sind in fast jeder Programmiersprache (und zwischen OS/2 und Windows) fast gleich bzw. zumindest leicht übersetzbar. Aber wenn du schon eine Lösung gefunden hast, gut.

Das Thema 'Tastendruck schicken' wurde hier (für den Fall Ctrl-Alt-Entf) besprochen: p/Invoke SendInput

HTH

herbivore

Thema: Aktivierungsschlüssel oder nicht?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Fabian,

ich würde keine Software kaufen, die ich Online freischalten muss (ich habe deshalb auch kein XP), schon gar nicht von einer kleinen Firma oder einer einzelen Person. Dazu wäre es mir viel zu riskant, bei einer Neuinstallation meines Systems und einem zwischenzeitlichen Konkurs der Firma, meine bereits bezahlte Software nicht mehr weiter einsetzen zu können. Ich bitte dich dringend von dem Plan Abstand zu nehmen!

Grüße

herbivore

Thema: MessageFilter - Wert an Formular übergeben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Steve1974,

ich denke auch, dass die Lösung darin liegt, eine zusätzliche (Ober-)Klasse einzuführen, die die benötigte Methode deklariert. Die verschiedenen Forumlare müssen dann von dieser erben statt von Form. Der Name FormWithBarcodeScannedMethod ist natürlich verbesserungsfähig.


public abstract class FormWithBarcodeScannedMethod : Form
{
   public virtual void BarcodeScanned (string barcode)
   {
   }
   //...
}

public class clsBarcodeMessageFilter : IMessageFilter
{
  string Barcode="";
  FormWithBarcodeScannedMethod _fm;
  
  public clsBarcodeMessageFilter(FormWithBarcodeScannedMethod fm)
  {
     _fm = fm;
  }
  //...
}

HTH

herbivore

Thema: Aktivierungsschlüssel oder nicht?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Maddinel,

ich weiß nicht, ob du das sowieso meintest, aber ich kenne das so, dass es nicht einen Schlüssel für eine Shareware gibt, sondern eine Schlüsselberechnungsmethode, die mindestens den Namen des Registrierten einbezieht. Also 'Peter Müller' bekommt einen anderen Schlüssel als 'Franz Schmidt'. Und die Korrektheit des Schlüssels wird nicht für sich, sondern immer gegen den Namen geprüft. Wenn dann ein Schlüssel verbreitet wird, muss immer mit verbreitet werden, von wem dieser Schlüssel stammt - zumindest solange keiner die Methode knackt, nach der der Schlüssel erstellt wird.

HTH

herbivore

Thema: Tastaturhook oder ähnliches?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo webby,

das mit GhostWriter und GhostTyper war mir schon aufgefallen, aber dann habe ich mir die Beschreibung von GhostWriter angesehen und war der Meinung, dass der das auch tut, was du brauchst. Außerdem ist der GhostWriter ja wohl immer noch Freeware - auch für den nicht privaten Gebrauch.

GhostTyper hatte früher (und von Anfang an, glaube ich) eine geteilte Lizenz für privaten (freien) und geschäftlichen (kostenpflichtigen) Gebrauch. Wenn ich das richtig sehe, ist ab Version 3.0 auch der private Gebrauch kostenpflichtig und es gibt nur noch eine freie (zeitbeschänkte?) Testversion.

Die neueste Version mit der alten Lizenz, die ich im Netz noch zum Runterladen gefunden habe, war 2.02a (wobei an vielen Stellen zwar 2.02a steht, der Link aber auf 3.0 geht, also Achtung). Ich selbst habe Version 2.01.

Bei GhostTyper gab (und vermutlich gibt es) zwei Modi für das Einfügen des Langtextes: Per simulierter Tastatureingabe (langsam, aber man kann nicht nur Text eingeben, sondern auch z.B. Menü-Shortcuts verwenden) oder per Zwischenablage (schnell, aber nur für Texteingabe und die Zwischenablage wird überschrieben). Mit dem zweiten Modus sollte dein Geschwindigkeitsproblem zu lösen sein.

Das ist den mindestens zwei Zeichen scheint mir auf den ersten Blick eine sinnvolle Beschränkung.

Wenn du aber wirklich selbst programmieren willst, musst du Win32-Hooks verwenden. Da sollte sich aber auch im Netz massig zu finden lassen. Ich habe selber schon mal - allerdings unter OS/2 - mit Keyboard-Hooks programmiert und könnte dir - wenn ich nächste Woche wieder Zugriff auf den Code habe - auf Anforderung ein paar Zeilen C++ posten.

HTH

herbivore

Thema: MessageFilter - Wert an Formular übergeben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Steve1974,

so ganz klar ist es mir immer noch nicht. Erbt denn deine Klasse Formular von Form? Wenn ja, dann kannste da doch gleich tun, was immer du willst. Wenn nicht, dann erstellst du in Deiner Klasse, die von Form erbt, eine neue Methode, die den Code als Parameter erhält und kannst in dieser Methode alles tun, was du willst.

HTH

herbivore

Thema: Dispose(). Wie richtig einsetzen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo AlinghiFan,

eine erste Einführung gibt:
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpguide/html/cpconCleaningUpUnmanagedResources.asp
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpguide/html/cpconimplementingdisposemethod.asp
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpguide/html/cpconOverridingFinalizeMethod.asp
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpguide/html/cpconUsingCDestructorSyntax.asp
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpguide/html/cpconUsingObjectsThatEncapsulateResources.asp

Vielleicht steht da ja schon mal mehr als in deinem Buch.

HTH

herbivore

Thema: Tastaturhook oder ähnliches?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo webby,

die von x-sharp genannte Liste von Abkürzungen läuft bei Word - glaube ich - unter dem Namen Autokorrektur.

Anwendungsübergreifend gibt es eine fertige Lösung: GhostTyperXML:

http://www.sc-data.de/ghosttyper/de/index.php3

Wenn du was programmieren willst, geht das über globale Hooks. Die Forumssuche sollte bei 'hook' was passendes zu Tage fördern.

herbivore

PS: Ich habe gerade gesehen, dass GhostTyperXML mittlerweile was kostet. Ich nutze noch eine ältere Freeware-Version.

Thema: Com+
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Seby007,

ich arbeite als Software-Entwickler für Banken und Versicherungen und bin als solcher bisher ganz um COM u.ä. herumgekommen. Daher wird es dich nicht überraschen, dass diesem Bereich keine Bedeutung zumesse. So wie ich .NET einschätze ist es auch designed, um alle anderen Entwicklungsmodelle abzulösen.

Trotzdem ist dies nur alle Einzelmeinung zu verstehen und erhebt keinen Anspruch auf Allgemeingültigkeit.

HTH

herbivore

Thema: Strings und char Array vergleichen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Fabian,

per String.IndexOfAny-Methode.

HTH

herbivore

Thema: aus Form1 das Form2 öffnen, dann Form1 schliesen
Am im Forum: GUI: Windows-Forms

Hallo Massaka,

dadurch, dass du in dem neuen Thread wieder Application.Run verwendest, wird die Anwendung nicht geschlossen, auch wenn das Application.Run des Main(Threads) beendet wird. So würde es also auch gehen.

Für das Öffnen eines neuen Forms ist es jedoch gar nicht nötig, einen neuen Thread zu öffnen und - da die Formulare hier seqentiell abgearbeitet werden - auch gar nicht sinnvoll. Und da meinen Vorschlag deshalb ohne Threads arbeitet, ist die genannte Änderung nötig.

herbivore

Thema: aus Form1 das Form2 öffnen, dann Form1 schliesen
Am im Forum: GUI: Windows-Forms

Hallo andreas_sharp,

statt


Application.Run(new Form2());

musst du


new Form2 ();
Application.Run ();

verwenden.

Genaueres in meinem Beitrag in

Form- und Codehandling

HTH

herbivore

Thema: Checkbox Status außerhalb der Form-Klasse auslesen
Am im Forum: GUI: Windows-Forms

Hallo christof.k,

nee, ich denke du bist noch nicht ganz auf dem richtigen Weg. Wenn deine Klasse HelpClass von MainForm erbt, dann hast du doch sowieso Zugriff auf die Instanzvariablen der Oberklasse - nagut, nur auf die, die protected sind, aber du kannst ja private in protected ändern. Du kannst also direkt die ComboBox ansprechen und musst keine weiteren Methoden definieren.

Wobei mich wundert, dass die HelpForm von MainForm erbt. Erzeugst Du denn nachher wirklich zwei Objekte oder nur eins vom Typ HelpClass?

Wenn Du nur ein Objekt erzeugst, dann brauchst du den ganzen Ramsch gar nicht, einfach protected statt private und direkt zugreifen.

Zwei Objekte erzeugst (ein MainForm und ein HelpClass) , dann ist deine Zuweisung im Konstruktor aber murx, da der Konstruktor von MainForm zweimal aufgerufen wird: einmal für das MainForm-Objekt, klar, und einmal für das HelpClass-Objekt, da ein HelpClass ja von MainForm erbt.

Wenn es wirklich zwei verschiedene Klassen sind, dann würde das so gehen (vorausgesetzt MainForm erzeugt das HelpClass-Objekt):


public class HelpClass
{
   public MainForm _mylocalmainform; // nicht static!

   HelpClass (MainForm mylocalmainform)
   {
      this._mylocalmainform = mylocalmainform;
   }
}

public class HelpClass
{
   //...

      // In der erzeugenden Methode
      new HelpClass (this);

   // ...
}

Also grundsätzlich: Mit static macht man eine Methode oder Variable zur Klassenmethode oder -variable. Dann gibt es die entsprechende Variable nur einmal pro Klasse und nicht einmal pro Objekt. Bei Klassen, von der es nur ein Objekt geben wird, ist das *trozdem* noch ein Unterschied, weil die Klassenvariabeln "immer" existieren und die Objektvariablen erst, nachdem das Objekt erzeugt wurde. Normalerweise braucht man nur Objektvariablen und ganz selten static-Variablen. Um etwas static zu machen, sollte man wollen, dass die Variable der Klasse gehört. Dies wäre z.B. der Fall, wenn man einen Zähler haben möchte, der der zählt, wieviele Objekte der Klasse schon erzeugt wurden. Denn muss man dann natürlich static machen. In Klassenvariablen speichert man also Informationen, die für *alle* Objekte gleich sind. Aber etwas static zu machen, weil man sonst nicht an die Information kommt ist murx.

HTH

herbivore

Thema: Access-Datei aus CSharp erstellen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Unikum,

eine Application-Datei kann man eben nicht generell erstellen, weil solche Dateien quasi per Definition anwendungsspezifisch sind. Wenn ich eine neue Anwendung schreibe und die Daten dieser Anwendung abspeichern will, dann denke ich mir halt ein neues Format aus. Anschließend kann dann genau meine Anwendung dieses Format lesen und schreiben, aber keine andere. Oft ist es sogar so, dass die Autoren von Anwendungen das Format extra kompliziert gestalten und auch keine Dokumentation über das Format offenlegen, damit andere Anwendungen eben nicht dieses Format lesen oder schreiben können.

Natürlich gibt es auch ein paar Standardformate, deren Spezifikation offen gelegt wurde, z.B. .bmp, .jpg u.ä.

Im Fall von Access sollte es aber möglich sein (zumindest, wenn du Access installiert hast). Da Access ein Datenbankformat ist und .NET mit Datenbanken umgehen kann, müsstest du in der Dokumenation bei den Datenbankklassen fündig werden (gemacht habe ich mit Access es noch nicht, aber es sollte wie gesagt gehen).

Nachfragen zu diesem Thema sind dann aber besser im Forum Entwicklung/ADO.NET aufgehoben.

HTH

herbiore

Thema: Interface, Klassen und Vererbung ?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo AlinghiFan,

na, für abstrakte Klassen hast du doch schon ein gutes Beispiel gegeben: Tier. Es ist nicht möglich bzw. sinnvoll ein allgemeines Tier-Objekt zu erzeugen, sondern nur Tiere konkreter Art, also z.B. Pferd. Ein weiteres Beispiel ist einer abstrakten Klasse ist GrafischesObjekt und mit Kreis, Rechteck u.ä. als konkrete Unterklassen. Abstrakte Klassen werden eingesetzt, um abstrakte Begriffe der realen Welt zu repräsentieren. Sie definieren die allgemeinen Eigenschaften und Fähigkeiten, die alle konkreten Unterklassen besitzen (sollen).

Ein Beispiel für ein Interface ist z.B. IEnumerable. Objekte einer Klasse, die IEnumerable implementiert, also z.B. Array, ArrayList, Hashtable, Stack u.ä., können dann unabhängig von der konkreten Klasse alle in der gleichen Weise über das Interface benutzt werden benutzt. Im Fall von IEnumerable z.B. in foreach-Schleifen.
Interfaces beschreiben meisten bestimmte Eigenschaften und Fähigkeiten, die man sich von den implementieren Klassen (zusätzlich) wünscht, wie aufzählbar, editierbar, formatierbar, serialisierbar usw.

HTH

herbivore

Thema: Checkbox Status außerhalb der Form-Klasse auslesen
Am im Forum: GUI: Windows-Forms

Hallo christof.k,

wenn du jemanden eine Nachricht schicken willst, dann musst du nicht nur wissen, welche Nachricht du schicken willst, sondern auch an wen du sie schicken willst. Auf die Objekte bezogen ist die Nachricht CheckBoxSelected und der Empfänger ist das MainForm-Objekt, dass du vermutlich im Main mit new MainForm (); erzeugst.

Dass der Empfänger mindestens so wichtig ist, wie die Nachricht selbst, wird klar, wenn Du gedanklich mehrere MainForm-Objekte erzeugst (das mag in deinem Fall nicht beabsichtig sein, aber nimm als einen Beispiel einen Browser; da kannst du ja auch mehere (Haupt-)Fenster öffen). Und wenn es mehrere MainForm-Objekte gibt, dann gibt es mehrere CheckBoxen und die können natürlich auch gerade unterschiedlich gesetzt sein.

Also ändern wir den Code erstmal wieder so, dass jedes MainForm-Objekt seine eigene cbMyCheckBox-Variable (und auch seine eigene CheckBoxSelected-Methode) hat.


namespace MyApp
{
    public class MainForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.CheckBox cbMyCheckBox;

        public MainForm()
        {
            this.cbMyCheckBox = new System.Windows.Forms.CheckBox();
        }

        public bool CheckBoxSelected()
        {
            return cbMyCheckBox.Checked;
        }
    }
}

Dann musst du nur noch dafür sorgen, dass der Absender von CheckBoxSelected auch den Empfänger gekennt. Wie diese Information zum Absender kommt, hängt natürlich von Deinem restlichen Programm ab. Wenn dein MainForm-Objekt das andere Fenster erzeugt, dann könntest du z.B. den Konstruktor des anderen Fensters um einen Parameter vom Typ MainForm erweitern und beim Erzeugen this (von MainForm) als Parameter übergeben.

HTH

herbivore

Thema: Checkbox Status außerhalb der Form-Klasse auslesen
Am im Forum: GUI: Windows-Forms

Hallo christof.k,

wenn sichergestellt ist, dass du nur ein MainForm-Objekt erzeugst und vor Benutzung von CheckBoxSelected das MainForm-Objekt erzeugt wurde, dann kannst du dass so machen (ohne Berücksichtigung von Fehlerbehandlung), aber schön ist das nicht:


namespace MyApp
{
    public class MainForm : System.Windows.Forms.Form
    {
        // die Variable ist jetzt auch static ...
        private static System.Windows.Forms.CheckBox cbMyCheckBox;

        public MainForm()
        {
            // deshalb steht hier auch kein this mehr
            cbMyCheckBox = new System.Windows.Forms.CheckBox();
        }

        public static bool CheckBoxSelected()
        {
            return cbMyCheckBox.Checked;
        }
    }
}

HTH

herbivore

Thema: Zeilennummer in richTextBox?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo therock,

wenn du den String nicht direkt parst, sondern erst nach dem Setzen des Texts in die RichTextBox in einer for-Schleife über RichTextBox.Lines, dann ist der Laufindex plus eins die jeweilige Zeilennummer.

Ansonsten könnte RichTextBox.GetLineFromCharIndex für dich interessant sein.

Für Zeilennummer vor jeder Zeile habe ich nichts gefunden. Kriegt man also eher nur per eigener Klasse hin, die von RichTextBox erbt und ist vermutlich keine ganze leichte Aufgabe.

HTH

herbivore

Thema: Combobox und die Eigenschaft BackColor
Am im Forum: GUI: Windows-Forms

Hallo boco25,

so geht's:


this.LaenderschluesselcomboBox.Enabled=false;
this.LaenderschluesselcomboBox.DropDownStyle=ComboBoxStyle.DropDownList;
this.LaenderschluesselcomboBox.BackColor=System.Drawing.SystemColors.Window;

HTH

herbivore

Thema: Dateiassoziation: Neue Dateinamen an die laufende Anwendung übergeben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Fabian,

das Senden von Daten von einer Instanz einer Anwendung an eine andere Instanz, geht unter Win32 ganz einfach mit PostMsg (ggf. unter Nutzung von shared mem) und empfangen werden die Daten in der Windowprozedur, wie alle anderen (System-)Nachrichten auch. Den WindowHandle, an den man senden muss, kriegt man in der Win32-Main-Funktion quasi gleich mitgeliefert.

Nun hat mich selber interessiert, wie man das unter .NET hinbekommt. Was dem Win32-Vorgehen ähnlichsten sieht und wohl auch ist, ist die Verwendung der Klasse MessageQueue. Allerdings muss dafür eine extra Komponente installiert werden. Schade!

Nun sollte aber die Kommunikation zwischen Anwendungen unter .NET eigentlich ja ganz einfach sein, das geht ja alleine aus dem Namen .NET hervor. Also habe ich mich auf .NET-Remoting gestürzt. Nun gut, ich finde das .NET-Remoting nach meiner Beschäftigung damit nicht so prickelnd, aber ich habe die Kommunikation hinbekommen.

Das folgende Programm kann man mehrfach starten. Die beim Start übergebenen Kommandozeilenargumemte werden in der TextBox der ersten Instanz angezeigt. Weitere Instanzen beenden sich nach dem Senden der Argumente an die erste Instanz sofort wieder.

[EDIT]Weiter unten gibt es ein Codebeispiel für .NET 2.0, das bevorzugt verwendet werden sollte.[/EDIT]


using System;
using System.Windows.Forms;
using System.Drawing;

using System.Threading;

using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

//*****************************************************************************
public class MyWindow : Form
{
   //--------------------------------------------------------------------------
   private TextBox tb;

   //==========================================================================
   public MyWindow (String strAllArgs)
   {
      Control ctrlCurr;

      //-----------------------------------------------------------------------
      Text = "Test";
      Size = new Size (220 + Size.Width - ClientSize.Width,
                        70 + Size.Height - ClientSize.Height);

      //-----------------------------------------------------------------------
      ctrlCurr = tb = new TextBox ();
      ctrlCurr.Location = new Point (10,10);
      ctrlCurr.Size = new Size (200, 50);
      ctrlCurr.Text = strAllArgs;
      Controls.Add (ctrlCurr);
   }

   //==========================================================================
   public void SetNewArgs (String strAllArgs)
   {
      tb.Text = strAllArgs;
   }

}

//*****************************************************************************
// Objekte dieser Klasse können von Ferne benutzt werden
//*****************************************************************************
public class ArgsReceviver : MarshalByRefObject {

   //==========================================================================
   // Diese wird in der ersten Instanz ausgeführt, aber von der weiteren
   // Instanz aufgerufen. Die Übergebenen Werte an das Hauptfenster
   // weitergegeben.
   //==========================================================================
   public void SetNewArgs (String strAllArgs) {
      App.MainForm.SetNewArgs (strAllArgs);
   }
}

//*****************************************************************************
abstract class App
{
   //--------------------------------------------------------------------------
   private static Mutex pobjMutex = null;
   private static MyWindow frmMain = null;

   //==========================================================================
   public static MyWindow MainForm
   {
      get {
         return frmMain;
      }
   }

   //==========================================================================
   public static int Main (string [] astrArg)
   {
      //-----------------------------------------------------------------------
      // Kommunikationsparameter
      //-----------------------------------------------------------------------
      String strUniqueName = "4e1a0b12-57e2-4f50-ac2c-573358fdc599"; // unbedingt durch eine eigene GUID ersetzen
      int    iUniquePort   = 8082;
      String strURLClient = "tcp://localhost:" + iUniquePort + "/" + strUniqueName;
      String strURLService = strUniqueName;

      //-----------------------------------------------------------------------
      // Argumente zu eienm langen String zusammenfügen
      //-----------------------------------------------------------------------
      String strAllArgs = "";
      foreach (String strArg in astrArg) {
         strAllArgs += strArg + " ";
      }
      strAllArgs = strAllArgs.Trim ();

      //-----------------------------------------------------------------------
      // Feststellen, ob wir erste oder weitere Instanz sind
      //-----------------------------------------------------------------------
      bool pobjIOwnMutex = false;
      pobjMutex = new Mutex (true, strUniqueName, out pobjIOwnMutex);
      if (pobjIOwnMutex) {
         //-----------------------------------------------------------------------
         // Als erste Instanz erzeugen wir den Server/Service-Part
         //-----------------------------------------------------------------------
         ChannelServices.RegisterChannel (new TcpChannel (iUniquePort));
         RemotingConfiguration.ApplicationName = strUniqueName;
         RemotingConfiguration.RegisterWellKnownServiceType (
            typeof (ArgsReceviver),
            strURLService,
            WellKnownObjectMode.SingleCall
         );

         //-----------------------------------------------------------------------
         // Erzeugen und öffnen des Hauptfensters
         //-----------------------------------------------------------------------
         frmMain = new MyWindow (strAllArgs);
         Application.Run (frmMain);

      } else {
         //-----------------------------------------------------------------------
         // Als weitere Instanz erzeugen wir den Client-Part
         //-----------------------------------------------------------------------
         RemotingConfiguration.RegisterWellKnownClientType (
            typeof (ArgsReceviver),
            strURLClient
         );

         //-----------------------------------------------------------------------
         // Und senden die Argumente an den Server/Service-Part
         //-----------------------------------------------------------------------
         ArgsReceviver argrecv = new ArgsReceviver ();
         argrecv.SetNewArgs (strAllArgs);
      }

      return 0;
   }
}
[EDIT]Die GUID 4e1a0b12-57e2-4f50-ac2c-573358fdc599 ist nur ein Beispiel und muss bei der Übernahme des Codes unbedingt durch eine eigene GUID ersetzt werden.[/EDIT]

[EDIT]Weiter unten gibt es ein Codebeispiel für .NET 2.0, das bevorzugt verwendet werden sollte.[/EDIT]
Da ich selber keine Erfahrungen mit dem .NET-Remoting habe, bin ich an Rückmeldungen zu möglichen Verbesserungen oder Fallstricken interessiert. Insbesondere stört mich, dass man eine Port verbrät. Gibt es keine Möglichkeit, statt eines TcpChannels oder HttpChannels irgendeinen speichergebundenen Kanal zu verwenden (RPC oder Named Pipes o.ä.)?

HTH

herbivore

PS: Wenn ich die Mutex-Variable nicht als static-Member sondern als lokale Varible in Main deklariert hätte, würde jede Inzanz denken, sie wäre die erste (sprich die bestehende Mutex der ersten Instanz wird nicht gefunden oder - was zu vermuten steht - exisitiert dann nicht mehr).

Thema: p/Invoke SendInput
Am im Forum: Rund um die Programmierung

Hallo IMGregor,

Wenn Du Tastatureingaben senden willst, dann musst du die Deklaration von struct INPUT erstmal abändern:


public struct INPUT
{
   public int type;
   public KEYBDINPUT  ki;
}

Das ergibt sich aus http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructures/input.asp?frame=true wo u.a. zu lesen steht:

typedef struct tagINPUT { 
  DWORD type; 
  union {MOUSEINPUT mi; 
            KEYBDINPUT ki;
            HARDWAREINPUT hi;
           };
  }INPUT, *PINPUT;

Dann musst du die Win32-KEYBDINPUT-Struktur nachbilden, zu sehen unter http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructures/keybdinput.asp :

typedef struct tagKEYBDINPUT {
    WORD wVk;
    WORD wScan;
    DWORD dwFlags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT;

Alles weitere sollte sich daraus ergeben oder den verlinkten MSDN-Seiten entnehmen zu sein.

HTH

herbivore

Thema: p/Invoke SendInput
Am im Forum: Rund um die Programmierung

Hallo IMGregor,

mit


[DllImport("User32.dll", SetLastError=true)]
public static extern int SendInput(int nInputs, ref INPUT pInputs, int cbSize);

erhältst du Zugriff auf die Win32-Funktion SendInput und zwar so, als hätte der Compiler für die obigen zwei Zeilen das folgende eingesetzt:


public static int SendInput(int nInputs, ref INPUT pInputs, int cbSize)
{
   // Aufruf der gleichnamigen Win32-Funktion
}

Du kannst SendInput also wie jede andere normale static-Methode der Klasse, in der die Deklaration steht, aufrufen.

Die zugehörige Win32-Funktion ist hier beschrieben:

http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/sendinput.asp?frame=true

Dort kannst du also auch sehen, was die einzelen Paramter bedeuten.

HTH

herbivore

PS: Axo, die public-struct-Zeilen sind dafür da, die Win32-C-Strukturen nachzubauen, die man als Parameter beim Aufruf (und evtl. der Rückgabe) braucht.

Thema: Dateiassoziation: Neue Dateinamen an die laufende Anwendung übergeben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Fabian,

also um das Starten der zweiten Instanz wirst du wohl nicht herum kommen, aber du kannst dort erkennen, dass es die zweite Instanz ist (siehe: mehrere Programminstanzen verhindern? ) und dann der ersten Instanz die Parameter der zweiten Instanz schicken. Jetzt musst du nur noch eine Lösung für das Verschicken von einer Anwendung zur anderen finden - ich habe da gerade ein blackuot. (Mit Win32-PostMsg gehts auf jeden Fall, aber es wird bessere Lösungen geben).

HTH

herbivore

Thema: Sockets: abgehenden Port bei Send festlegen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Joltan,

heißt das, dass wir dich beim Cheaten und/oder der Datenspionage unterstützen sollen? Nur eine Frage!

herbivore

Thema: Click outside Form
Am im Forum: GUI: Windows-Forms

Hallo DirtDevil,

ich denke mal, dieser UniversalLostFocus-Handler müsste es tun:


protected void UniversalLostFocus (Object sender, EventArgs e)
{
   if (Form.ActiveForm != null) {
      // Fokus hat intern gewechselt
   } else {
      // Fokus wurde vollständig verloren
   }
}

HTH

herbivore

Thema: Schließen eines Forms, ohne die komplette Anwendung zu schließen [war: Form- und Codehandling]
Am im Forum: GUI: Windows-Forms

Hallo -acid-,

ich weiß nicht, ob das hilft, bin mir noch nicht mal sicher, ob es genau auf Deine Frage passt, aber:

Beim Erstellen einer Anwendung muss man sich entscheiden, ob diese ein Hauptfenster haben soll oder ob alle Fenster gleichberechtigt existieren sollen. Ich habe mal ein kleines Programm angefügt, das zeigt, wie das geht. Je nachdem, ob SW_MAINWINDOW definiert ist oder nicht, wird das Programm mit Hauptfenster oder eben mit gleichberechtigten Fenstern übersetzt.

Der springende Punkt ist, dass die Nachrichtenverarbeitung des Programms (Main-Loop oder auch Application.Run) und das Vorhandensein von Fenstern erstmal unabhängig ist. Es kann also eine Main-Loop ohne Fenster geben (und andersherum).

Wenn das letzte Fenster geschlossen ist, aber die Main-Loop noch existiert, wird das Programm noch nicht beendet. Deshalb musst man auch in der !SW_MAINWINDOW-Variante die Main-Loop selbst mit Application.Exit beenden.

Wenn dagegen bei Application.Run ein Form-Objekt mitgegeben wird, macht Windows dieses zum Hauptfenster und ruft beim Schließen dieses Fenster Application.Exit automatisch auf. Dadurch werden auch alles anderen Fenster geschlossen und die Main-Loop beendet.


using System;
using System.Windows.Forms;
using System.Drawing;

//****************************************************************
public class MyWindow : Form
{
   //-------------------------------------------------------------
   static int iId    = 1;
   #if !SW_MAINWINDOW
      static int iCount = 0;
   #endif

   //=============================================================
   public MyWindow ()
   {
      Control ctrlCurr;


      //----------------------------------------------------------
      #if !SW_MAINWINDOW
         ++iCount;
      #endif
      Text = "Window " + iId++;
      Size = new Size (220 + Size.Width - ClientSize.Width,
                        70 + Size.Height - ClientSize.Height);

      //----------------------------------------------------------
      ctrlCurr = new Button ();
      ctrlCurr.Location = new Point (10,10);
      ctrlCurr.Size = new Size (200, 50);
      ctrlCurr.Text = "New Window";
      ctrlCurr.Click += new EventHandler (ButtonClick);
      Controls.Add (ctrlCurr);

      //----------------------------------------------------------
      #if !SW_MAINWINDOW
         Disposed += new EventHandler (MyWindowDisposed);
         Show ();
      #endif
   }

   //=============================================================
   protected void ButtonClick (Object sender, EventArgs e)
   {
      MyWindow myw = new MyWindow ();
   }

   //=============================================================
   #if !SW_MAINWINDOW
      protected void MyWindowDisposed (Object sender, EventArgs e)
      {
         if (--iCount ≤ 0) {
            Application.Exit ();
         }
      }
   #endif
}

//****************************************************************
abstract class App
{
   //=============================================================
   public static int Main (string [] astrArg)
   {
      #if !SW_MAINWINDOW
         new MyWindow ();
         Application.Run ();
      #else
         Application.Run (new MyWindow ());
      #endif

      return 0;
   }
}

HTH

herbivore

Suchhilfe: 1000 Worte