Laden...

Forenbeiträge von t2t Ingesamt 415 Beiträge

09.04.2008 - 18:06 Uhr

Ich danke euch schonmal. Werde beide Varianten mal genauer anschauen...

09.04.2008 - 17:28 Uhr

Hallo,

ich hatte mich gerade mit einem kleinen Programm beschäftigt, welches einen Screenshot von einem definierten Bereich des Monitors macht. Ursprünglich gedacht um einen Screenshot von einer HTML Seite zu machen, die beispielsweise im IE geöffnet ist.

Dabei kam mir die Idee, wäre es nicht auf irgendeine Art und Weise möglich eine geladene Seite aus dem IE, die größer ist als ein Bildschirm ist zu "Screenshoten" ?
Entstehen würde dann z.B. ein Bild in der Größe 1024 x 3000 (je nach größe der Auflösung beim Anwender).

Mein Problem ist nur leider, dass ich überhaupt nicht weiß wie Windows bzw auch der IE (der eventuell die Daten hält) sowas technisch lösen. Die Screenshot Funktion die ich zur Zeit verwende hab ich aus einem einfachen Codebeispiel, bei der sich das Programm der User32.dll bedient:


[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();

Ich gehe davon aus, dass dabei wohl der Framebuffer ausgelesen wird und diese Informationen in eine Bilddatei geschrieben werden können. Hat aber jemand ne Ahnung wie es mit den Daten sind die sich noch nicht im Framebuffer befinden ?
Oder hat jemand Ideen wie man an so ein Problem rangehen kann, um es zu lösen? Noch bin ich recht ratlos, wie sowas gehen könnte...

Bin gespannt auf interessante Tipps 😉

08.04.2008 - 12:30 Uhr

Hallo zusammen,

folgendes Anliegen: Ich stehe gerade am Anfang meiner Diplomarbeit und habe mir zum Thema gemacht ein Workflow-Management-System in einer Firma aus der Filmbranche einzuführen.
Wir haben uns dafür für ein kommerzielles System entschieden, welches die Basis darstellt und eine Art Framework anbietet. Das bedeutet das System übernimmt u.a. die Rechteverwaltung der User, das Handling der Ereignisse und besitzt eine Schnittstelle zu Visual Studio 2005, mit einem integrierten Designer zur Prozesskettenmodellierung.
Somit wird in erster Linie meine Aufgabe darin bestehen, die auftretenden Prozesse zu analysieren, modellieren und in C# zu implementieren.

Ich poste das aus dem Grund, weil ich mir dachte, dass in einer solch großen Community von Entwicklern bestimmt auch welche bei sind die sich mit dieser Thematik schonmal beschäftigt haben. Da ich noch ganz am Anfang stehe und nicht so recht weiß wie der Weg laufen wird, hatte ich mir gedacht, dass es vielleicht welche gibt die gute Ratschläge geben können. Fehler die es zu vermeiden gilt. Gute Literaturtipps zu diesem Thema usw usw ...

Würd mich freuen ein paar Ratschläge zu bekommen, in welcher Form auch immer ... denn noch erscheint dieses Thema so riesig, dass ich es kaum zu fassen weiß.

28.03.2008 - 13:56 Uhr

Hehe. Wie gut, dass bei uns nicht solche rebellischen Mitarbeiter arbeiten und ich der einzige Entwickler bin. Bin trotzdem der Meinung, dass sich das Tool super handeln lässt und die Arbeit nicht stört ^^

28.03.2008 - 13:39 Uhr

Ich dank dir herbivore, ich hab das jetzt einfach über Form.LocationChanged gelöst. Da das Tool zur Zeiterfassung der Mitarbeiterzeiten fungiert und sich sofort in die System-Tray-Leiste minimiert, wenn ein Todo an dem gearbeitet wird ausgewählt wurde, ist das ganze eigentlich auch aus Software-Ergonomischer Sicht vertretbar 😉

28.03.2008 - 09:11 Uhr

Diese Einschränkung ist sehr wohl so gewollt, da der benutzer mit der form interargieren muss. In der praxisanwendung bei uns im betrieb wurde beobachtet, dass einige mitarbeiter die anwendung auf den zweiten monitor verschoben haben und somit keine interaktion stattfindet, zwischen Tool und benutzer, so wie eigentlich gewollt.
Klar, mit einem maximieren der anwendung wäre das problem eventuell zu lösen, nur leider tut das dem design der anwenung einen abbruch 🤔

27.03.2008 - 17:55 Uhr

Hmm, bist du sicher? Meine Anwendung startet ja nicht maximiert. Sie soll wie man es von einigen Windows-Message-Boxen kennt zentriert, nicht maximiert und nicht verschiebbar dargestellt werden.

Oder macht das genau dieses "FullScreen" ... hab davon vorher noch nichts gehört und bei einem flüchtigen Blick in MSDN hatte ich nichts gesehen...

27.03.2008 - 17:27 Uhr

Gibt es eine Möglichkeit das Verschieben einer Form zu verhindern? Ich kenne das noch aus Delphi, wo man Fenster modal aufrufen konnte und diese z.B. immer im Center vom Bildschirm steht.
Meine Anwendung startet nicht im maximierten Zustand, ich will nun dem Benutzer verbieten sie zu verschieben (und auch zu minimieren, dies ist aber schon umgesetzt), er muss erst mit der Form interargieren bevor sie verschwindet.

Wär dankbar über Tipps!

07.03.2008 - 17:29 Uhr

Liebe Community,

mir wurde vor kurzem erst geholfen in diesem Thread: Deadlock Problem

Ich war davon ausgegangen, dass ich es mit einem Deadlock zu tun hab - was wohl auch der Fall ist. Durch die Tipps fürs Logging meiner Application konnte ich den Fehler ziemlich genau eingrenzen. Wie es scheint, bereitet mir das DataSet sorgen, welches meine GUI benötigt, um die benötigten Daten anzuzeigen.

Ich versuche im Folgenden verständlich zu erklären, was in etwa in meinem Programm geschieht. Ich muss noch hinzufügen, dass ich dieses Projekt nur übergeben bekommen habe und der Bug bereits drin war und ich nun seit einiger Zeit verzweifelt danach suche.

Es handelt sich um eine Applictaion zur Mitarbeiter-Zeiterfassung. Dabei wählt der Mitarbeiter ein Todo an, an dem er gerade arbeitet und im Hintergrund werden alle 10 Min. Zeitstempel in eine Datenbank geschrieben.

-Nachdem ein Todo ausgewählt wurde, schließt sich die Form und ist nur noch als Traysymbol in der Taskleiste sichtbar.

  • Die Form kann vom Benutzer selbst, mit einem Klick auf das Traysymbol, geöffnet werden.
  • Die Form öffnet sich von selbst, wenn 10 Min. keine Aktivität stattgefunden hat.
  • Die Form öffnet sich von selbst, wenn ein neuer Prozess entdeckt wurde (z.B. der IE gestartet wurde)

Nun tritt der Fehler unregelmäßig (nicht deterministisch) auf, wenn zuerst der Timer (nach einer Idle-Time) die Form selber öffnet. Der User reagiert und auf ein Todo klickt, sodass die Form sich wieder schließt UND GENAU DANN von selbst nochmal versucht per Traysymbol die Form zu öffnen ... genau dann wird die Form nicht mehr angezeigt. Aus meinem Logging entnehme ich, dass alle Prozesse ordnungsgemäß durchlaufen werden und auch die Timerfunktion noch im Hintergrund weiterläuft.

Nach einigem rumprobieren habe ich einfach mal das DataSet auskommentiert, welches die Form benötigt. Siehe da, der Fehler trat nicht mehr auf ... ich hatte zwar kaum noch Infos in der Form zum anzeigen, aber das verhaken trat nicht mehr auf.

Codetechnisch sieht das zusammengefasst so aus:

Es gibt eine Dispatcher-Klasse, welche die Form instanziert


public delegate void ShowTodoDialog(bool enablePauseButton);

 // some code

public void Start()
        {

            // DTO initial Befüllen, GENAU HIER WIRD DAS BENÖTIGTE DATASET GELADEN und in einer privaten lokalen Variable abgelegt

            LoadUserDto(true);
            LoadProjectDto(true);

            // some code
        }

private void ShowTodoDialog(bool enablePauseButton)
        {
            try
            {
                
                if (_dialogOpen == false)
                {
                    _dialogOpen = true;
                    if (_todoDialog == null)
                    {
                        _todoDialog = new TodoDialog(_userDto, _projectDto); // HIER WIRD DIE FORM INSTANZIERT UND DAS DATASET ÜBERGEBEN
                        _synchronizeDelegate = new Synchronize(_todoDialog.Synchronize);
                        _updateDelegate = new Update(_todoDialog.Update);
                        _todoDialog.UpdateRequest += new UpdateRequestHandler(TodoDialog_UpdateRequest);
                    }

                    if (!_todoDialog.Visible)
                    {
                          this._todoDialog.ShowDialog(enablePauseButton);
                    }
                 }
            }
            catch (Exception e)
            {
                MessageBox.Show("FEHLER: " + e.Message);
            }
        
            finally
            {
                _dialogOpen = false;  
            }
        }

Die TimeLogger-Klasse ist diejenige, die ShowTodoDialog aufruft. Und zwar in folgenden drei Funktionen:


public class TimeLogger : IDisposable
    {
        private ShowTodoDialog _requestDialog = null;

        public TimeLogger(ShowTodoDialog requestDialog)
        {
            this._requestDialog = requestDialog;
        }
        
        //some code

        public void ShowDialog() // Wird augeführt, wenn das Traysymbol geklickt wird (ist im Traysymbol Click Event hinterlegt)
        {
             this._requestDialog(false);
        }

// Beim Erkennen eines neuen Prozesses, wird die Form aufgerufen
        public void ProcessWatcher_ProcessesChanged(object sender, ProcessesChangedEventArgs e)
        {
            _watchedProcesses = e.NewWatchedProcesses;
            _currentHost = e.NewHostName;

            _currentLocationFlag = ActiveDirectoryConnector.GetStudioFlag(_currentHost);

            // bei neuen Prozesses
            // Todo-Dialog aufrufen
            if (e.ProcessesAdded)
            {
                  _requestDialog(false);
            }
        }

        // Timerfunktion, die einen Zeitstempel schreibt und wenn eine Timeoutzeit überschritten wurde _requestDialog(true) aufruft (geschieht in der Fkt WriteTimeStamp())
        private void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            try
            {
                (sender as System.Timers.Timer).Stop();
                WriteTimeStamp();
            }
            finally
            {
                (sender as System.Timers.Timer).Start();
            }
        }
   }

Die Controller-Klasse startet das gesamte Programm indem es den Dispatcher und den Timelogger instanziert


        private TimeLogger _logger = null;
        private TodoDispatcher _dispatcher = null;
        private ShowTodoDialog _requestDialog = null;

        private void InitTodoDispatcher()
        {
            if (_dispatcher == null)
            {
                _dispatcher = new TodoDispatcher();
                _requestDialog = new ShowTodoDialog(_dispatcher.ShowDialog);
                _dispatcher.SelectionChanged += new SelectionChangedHandler(DispatcherSelectionChanged);
            }
        }

        private void InitTimeLogger()
        {
            if (_logger == null)
            {
                _logger = new TimeLogger(_requestDialog);
            }
        }

// Ebenso wird im Controller das Event für das Traysymbol Click Ereignis definiert
void TrayIcon_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (_dispatcher != null)
                {
                    _logger.ShowDialog();
                }
            }
        }

Das wären die Codeteile, die meiner Ansicht nach relevant sind für dieses einfrieren. Ich hoffe damit kann jemand Ansatzweise was anfangen. Ich weiß absolut nicht mehr weiter und bin über jeden Tipp dankbar. Natürlich hatte ich vor dem Thread erstellen auch nochmal gründlich die FAQ's zu den GUI Problemen und der Invoke-Thematik angeschaut. Kann aber nichts entdecken, was diesen Fehler verursachen könnte ... Ihr seit meine letzte Hoffnung ...

05.03.2008 - 12:57 Uhr

Das wäre schonmal ein guter Ansatz. Werd ich gleich mal versuchen. Vielen Dank!

05.03.2008 - 11:55 Uhr

Hallo,

welche Möglichkeiten gibt es Deadlocks aufzuspüren? Bzw. gibt es da überhaupt Möglichkeiten? Ich sitze seit einer Woche an einem extrem harten Fehlerfall, den ich zwar reproduzieren kann, aber keinen blassen schimmer habe, wie der Zustande kommt. Auch durchs debuggen lässt sich nichts herausfinden. Das Programm läuft im Debugmodus so durch wie es sollte, nur hängt es sich trotzdem auf. Ich hab im Falle des Aufhängens auch schon den Pause-Button im Debugmodus betätigt, um mir die Aufrufliste und das Ausgabenfenster anzuschauen. Kein Hinweiß. Im Ausgabenfenster wird nichts verdächtiges angezeigt, wie etwa unbehandelte Exceptions und in der Aufrufliste steht bloß die zuletzt aufgerufene Funktion, was in diesem Fall immer ShowDialog() ist.

Ich hab schon soviel rumprobiert und bin nun am Ende mit meinem Latein, vielleicht hat ja jemand einen nützlichen Tipp...

09.01.2008 - 14:07 Uhr

Traumhaft! Das war der Fehler. Nach erhöhen der Timeoutzeit auf 7 Minuten klappt es bestens.

Vielen Dank!

09.01.2008 - 13:26 Uhr

Hallo,

ich entwickel gerade ein Tool, welches eine extrem große und langwierige MySql Abfrage an ca. 400 Datenbanken stellt. Dabei laufe ich in einer Schleife über alle Datenbanken und erstelle mir eine temporäre Datenbank.
Klappt alles bestens, wie es soll. Allerdings stoße ich bei einer besonders großen Datenbank (und länger dauernden Abfrage) an das Problem, dass mein try-Block nach ca 30 Sek. einen Timeout-Fehler wirft. Angeblich weil der Datenbankserver nicht mehr antwortet.
Wie kann ich dieses Problem am besten elegant umgehen? Ich würde den Programmcode gerne Schützen, sodass meine Application auf das beenden des Codes wartet. Mit dem Versuch den Teil einfach in einen Thread auszulagern kam ich nicht weit.

Über Tipps die mir weiterhelfen wäre ich sehr dankbar!

24.10.2007 - 09:19 Uhr

Danke soweit, aber dieser Thread hier enthielt Code-Snippets die meine meisten Fragen beantwortet haben:

DLL's verwenden und Outlook via Reflections

22.10.2007 - 11:23 Uhr

Hallo,

nach etwas Recherche habe ich noch nichts finden können, was mir bei meinem Problem wirklich helfen kann. Ich möchte aus meinem Programm heraus Outlook starten, was ja weiter kein Probelm darstellt:


System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "outlook";
// proc.StartInfo.Arguments = "contacts";
proc.Start();
proc.WaitForExit();


Nun hatte ich - wahrscheinlich naiverweise - gedacht, ich könne Outlook einfach beim Start mit Parametern fütter, so dass das Programm gleich mit einer leeren Email startet. Hierzu hab ich leider nichts finden können ... auch der auskommentierte Teil proc.StartInfo.Arguments, funktioniert nicht. Ich erhalte da bloß die Meldung, dass die Parameter ungültig sind.

Ich würde optimalerweise gerne Outlook aus meiner Application starten können, und dabei das versenden einer Email vorbereiten, was heißt dass bereits die Empfängeradresse und ein vorgefertigter Text von meiner Application eingefügt wurde.

Ich möchte das ganze gerne mit Outlook realisieren und nicht mit den vorgefertigten C# Komponenten, weil ich vor dem Absenden dem Benutzer die Möglichkeit geben will noch Anhänge hinzuzufügen, oder auch das Outlook-Adressbuch zur Verfügung zu haben.

Ich würd mich freuen, wenn ich einen Tipp bekäme, wie ich mein Vorhaben am leichtesten umsetzen könnte.