Laden...

Forenbeiträge von Anonymous Developer Ingesamt 24 Beiträge

07.10.2010 - 22:40 Uhr

Hallo alle zusammen,

die Lösung mit using (mehrere Programminstanzen verhindern?) gefällt mir sehr gut. Diese habe ich in meinem o.g. Code eingebaut und es funktioniert nun wie es sollte: Der Release-Build lässt sich nur noch ein mal ausführen.

Vielen Dank euch allen für eure Hilfe.

MfG

04.10.2010 - 23:58 Uhr

Hi,

also ich habe mal versucht die Versionsnummer aus dem Mutex-Namen wegzulassen, was aber auch nicht geholfen hat. Die Sache mit dem GUID habe ich noch nicht ausprobiert.

Jedenfalls verwende ich Visual Studio 10 falls das ein Anhaltspunkt sein könnte. Auch habe ich versucht die Zielplattform von .NET 2.0 bis 4.0 zu ändern, um auszuprobieren, ob sich die Anwendung dann anders verhält, was diese jedoch nicht tat.

Es ist nach wie vor so, dass ich das Relese-Kompilat mehrfach ausführen kann, das Debug-Kompilat verweigert jedoch die mehrfache Ausführung.

Ich habe hier drei System auf denen ich das getestet habe (XP, 2003, 7). Eventuell möchte jemand interessiertes das Projekt selbst bei sich kompilieren und sich von dem Problem überzeugen? Das Projekt ist für Jedermann frei zugänglich @ http://sourceforge.net/projects/wlipper/files/Wlipper/Version%203.5.7.5/Wlipper_3575_src.zip/download

MfG

04.10.2010 - 07:25 Uhr

Hallo,

in meiner Anwendung habe ich den hier beschriebenen Beispiel-Code verwendet, um die Ausführung mehrerer Anwenungsinstanzen zu verhindern. Etwa so:

    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            // Single instance only allowed
            bool firstInstance = false;
            string mutexName = string.Format("{0} {1}", Application.ProductName, Application.ProductVersion);
            Mutex mutex = new Mutex(false, mutexName, out firstInstance);

            if (firstInstance)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                new WlipperForm();
                Application.Run();
            }
            else
            {
                MessageBox.Show(string.Format(Localization.INSTANCE_RUNNING, Application.ProductName, Application.ProductVersion), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }
    }

Allerdings funktioniert es bei mir nur, wenn ich die Anwendung mit der DEBUG-Konfiguration kompiliere. Und wenn ich diese mit der RELEASE-Konfiguration kompiliere, funktioniert es nicht und mehrere Instanzen werden zugelassen, wenn ich die Anwendung öfters ausführe. - Weiß vielleicht jemand Rat für mich, was hier falsch läuft?

Danke im Voraus.

MfG

01.08.2010 - 13:25 Uhr

Es ist schon etwas länger her aber für mich nach wie vor aktuell gewesen. Dies hier ist wohl die eleganteste Lösung @ http://blog.xploiter.com/c-and-aspnet/need-to-left-click-on-a-notifyicon/ Somit verhält sich das Kontextmenü mit einem Linksklick genauso wie mit einem Rechtsklick.


using System.Reflection;

private void notifyIcon1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        MethodInfo mi = typeof(NotifyIcon).GetMethod(“ShowContextMenu”, BindingFlags.Instance | BindingFlags.NonPublic);
        mi.Invoke(notifyIcon1, null);
    }
}

05.05.2009 - 17:34 Uhr

Hat niemand eine Erklärung dafür, warum jetzt zwei Verzeichnisse für Anwendungsdaten existieren?

%APPDATA% C:\Dokumente und Einstellungen&lt;User Name>\Anwendungsdaten&lt;Anwendung>
.NET Konfigurationsmodell C:\Dokumente und Einstellungen&lt;User Name>\Lokale Einstellungen\Anwendungsdaten&lt;Anwendung>

25.04.2009 - 21:58 Uhr

Hi,

zu dem tollen Konfigurationsmodell habe ich noch eine Frage: Warum werden die Konfigurationsdateien nicht wie gewohnt in %APPDATA% sondern im Verzeichnis C:\Dokumente und Einstellungen&lt;User Name>\Lokale Einstellungen\Anwendungsdaten&lt;Anwendung> abgelegt? Der neue Ort macht die Umgebungsvariable %APPDATA% quasi unbrauchbar. Welche Möglichkeiten hat man denn sonst noch möglichst programatisch auf das neue Konfigurationsverzeichnis zuzugreifen?

Danke & Grüße

23.04.2009 - 16:02 Uhr

Danke für den Logging-Tipp.

Nee, alternativen sind mir nicht bekannt, ich meine bereits gründlich recherchiert zu haben, denke ich.

23.04.2009 - 15:40 Uhr

Hat niemand eine Idee? Oder habe ich mein Problem nicht präzise genug beschrieben? 😦

16.04.2009 - 11:59 Uhr

Hallo,

ich habe eine Anwendung geschrieben, die einmal gestartet im Hintergrund läuft und auf Änderungen in der Zwischanablage reagiert. Realisiert habe ich dies so, wie es z.B. hier: http://www.codeguru.com/csharp/.net/net_general/tipstricks/print.php/c7315 ...erläutert wird. Also indem die Forms-Anwendung mittels einiger Win32-API Befehle sich in der so genannten ClipBoardChain registeriert.

Das Ganze funktioniert auch wunderbar. Aber wenn ich diese Anwendung stundenlang im Büro laufen lasse, kann es sein, dass die Anwendung aus dem ClipBoardChain rausfliegt und gar nicht mehr auf Änderungen der zwischanablage reagiert. Starte ich die Anwendung wieder neu, dann funktioniert es wieder. Komischerweise gibt es auch Tage an denen die Anwendung gar nicht rausfliegt und den ganzen Büroalltag lang funktioniert wie sie soll.

Hat vielleicht jemand Erfahrung mit dieser Methodik (auf Änderungen der Zwischanablage zu reagieren) und weiß wo das oben beschriebene Verhalten seine Ursache haben könnte?

Vielen Dank!

Grüße

08.02.2009 - 17:35 Uhr

[EDIT=herbivore]Abgeteilt von [Tutorial] Das neue Konfigurationsmodell im .NET Framework 2.0[EDIT]

Noch eine Frage zu dieser Technik: In das Release-Verzeichnis eines EXE-Projektes wird ebenfalls die <Projektname>.config Datei mit ihren Standardwerten kopiert. Wenn ich mich aber nicht irre, dann sind diese Config-Settings auch als resource in der kompilierten Datei vorhanden. Muss also diese Standard-Config mit ausgeliefert werden oder nicht?

Grüße

06.02.2009 - 19:00 Uhr

Herzlichen Dank. Das werde ich mir mal zu gemühte ziehen.

06.02.2009 - 18:42 Uhr

Hallo zusammen,

Hintergrund
Für meine Anwendung möchte ich eine Art Konfigurationsdatei-Funktion implementieren. Und zwar für eine Multi-User-Windows-System-Anwendung, d.h. jeder User soll seine eigenen zur Anwendung gehörenden Konfigurationsdateien im %APPDATA% Verzeichnis liegen haben. Das ganze stelle ich mir ungefähr so vor:

Beim Programmstart
1.) Falls Konfigurationsdatei nicht vorhanden, eine neue mit Standardwerten erstellen.
2.) Falls Konfigurationsdatei vorhanden, Werte aus Datei auslesen.

Im Konfigurationsdialog der Anwedung
1.) Beim klicken auf den OK-Button, Optionswerte in die Konfigurationsdatei schreiben.

Frage
Bietet Visual Studio 2005/2008 eine .NET Komponente, die mir dabei hilft so etwas zu realisieren? Oder bin ich gezwungen, eine eigene Konfigurations-Engine zu schreiben? Es gibt ja nämlich die App.Config bzw. die Settngs.Config Dateien, die man in einem Projekt anlegen kann. Leider habe ich noch nicht viel Erfahrungen, wozu diese gedacht sind bzw. wie man diese für eigene Projekte einsetzen könnte? - Wüsste jemenad einen Rat zu dieser Problemstellung?

Grüße

04.02.2009 - 17:38 Uhr

Das ist auch hilfreich, falls man eine resource im temporären Ordner speichern will: http://www.knowdotnet.com/articles/tempfiles.html

04.02.2009 - 15:44 Uhr

Danke für den Styleguide-Tipp. Durch diesen habe ich mich auf Auskommentierungsrecherchen begeben.

Und inzwischen habe ich das Problem lösen können: es war die Eigenschaft ShowInTaskBar (siehe Post oben), die diesen Effekt, dass die Form nicht mehr im ClipBoardChain war, bewirkt hat. Warum weiß ich aber nicht. Jedenfalls bewirken die Methoden Show() bzw. Hide() implizit das Togglen der ShowInTaskBar-Eigenschaft mit. So brauch ich diese Eigenschaft nicht mehr explizit setzen und die Anwendung funktioniert wie ich es will. Aber erklären kann ich das nicht. - Danke nochmals!

Grüße

03.02.2009 - 22:18 Uhr

THX für den Hinweis. - Jetzt habe ich auch ein Beispiel dazu gefunden: MSDN: Dateien als eingebettete Ressourcen nutzen

03.02.2009 - 19:59 Uhr

Hallo,

in meinem Projekt habe eine HTML-Datei liegen, die ich mittels Visual Studio 2008 auf Eingebettete Ressource gestellt habe. Wie kann ich nun zur Laufzeit auf die Datei zugreifen, um diese z.B. im Browser öffnen zu lassen? - Die Funktionsweise des ResourceManagers ist mir dazu nicht ganz klar.

Grüße

03.02.2009 - 19:47 Uhr

Hallo,

sorry, aber irgendwie hatte ich keine Idee für eine geeignetere Überschrift für diese meine Frage:

Meine Forms-Anwendung habe ich im Constructor mittels Win32-Funktionen in der ClipboardChain registriert, damit ich in der Lage bin auf spezielle WindowsMessages zu horchen. Implementiert habe ich diese Funktion anhand dieses http://www.codeproject.com/KB/audio-video/TalkingClipboard.aspx Tutorials.

Das ganze klappt auch soweit gut, jedoch habe ich in der Form auch eine Toggle-Funktion, um die Form sichtbar zu machen bzw. auszublenden. Diese Funktion sieht wie folgt aus:


        /// <summary>
        /// Toggles the visibility of the Form.
        /// </summary>
        private void ToggleWindow()
        {
            // Toggle window
            if (Visible == false)
            {
                Show();
                Visible = true;
                ShowInTaskbar = true;
            }
            else if (Visible == true)
            {
                Hide();
                Visible = false;
                ShowInTaskbar = false;
            }
        }

Sobald aber diese Funktion aufgerufen wird (egal in welchem der beiden Zustände sich die Form gerade befindet, scheint meine Anwendung aus der ClipboardChain rauszufliegen und folglich kann nicht mehr auf entsprechende WindowsMessages reagiert werden.

Natürlich könnte ich in der Toggle-Funktion meine Anwendung erneut registrieren aber das finde ich ist unschön. So hätte ich an drei stellen den Code für die Registrierung zum horchen auf WMs.

Auch habe ich eine Funktion zum deregistrieren aus der ClipboardChain, die aufgerufen wird, wenn die Anwendung beendet wird. An einem Breakpoint an dieser stelle hält der Debugger nach dem Togglen nicht an, da wie gesagt die Anwendung irgendwie aus der ClipboardChain rausfliegt.

Was ist der Grund für dieses Verhalten bzw. wie kann ich es unterbinden?

Danke im Voraus und Grüße

03.02.2009 - 19:24 Uhr

Vielen Dank. Beide Tipps haben funktioniert 😃

03.02.2009 - 18:17 Uhr

Hallo,

in meiner Form-Anwendung sind mehrere Controls und ich hätte es gerne, dass ein bestimmter Button den Focus erhält. So dass z.B. ein schneller Tastendruck auf Enter den entsprechenden Button invoked.

Button.Focus() funktioniert nicht. Wie könnte man das sonst noch machen? Ist das eventuell im Designer festzulegen?

Grüße

28.01.2009 - 12:57 Uhr

oder bei application.run einfach die form nicht mitübergeben....
Dabei muss man aber beachten im Dispose der Form Application.Exit() selbst aufzurufen, da sich die Anwendung sonst nicht beendet.

/Edit: Siehe auch:
>

Vielen Dank. Damit habt ihr mir schon geholfen.

🙂

Gruß

28.01.2009 - 11:40 Uhr

Hallo,

meine Anwendung besteht aus einem Fenster, das ein NotifyIcon enthält. Über das Doppelklick-Event auf das Icon in der Taskleiste rufe ich eine ToggleWindow-Methode auf, welche das Fenster anzeigt bzw. versteckt. Das klappt auch soweit. Allerdings hätte ich gerne das Fenster bereits beim Start der Anwendung im versteckten Zustand. Der folgende Code:


Hide();
Visible = false;
ShowInTaskbar = false;

...scheint im Form-Load-Event nicht zu funktionieren. Im Form-Activated-Event funktioniert es zwar, jedoch sieht man für den Bruchteil einer Sekunde das Fenster aufblitzen und wieder verschwinden. Dies ist für mich nicht gut genug.

Frage: Wie bleibt die Form beim Start der Anwendung schön verborgen?

Grüße

24.01.2009 - 10:45 Uhr

Hallo,

in meiner Freizeit entwickle ich hobbyartiges, wozu ich sowohl eine Visual Studio .NET 2003 Academic (SSL-Lizenz) als auch eine Visual Studio 2008 Express Entwicklungsumgebung einsetze. Mich würde interessieren in wie weit ich die damit entstandene Software kommerziell vermarkten darf oder auch nicht? - Kann mich da jemand aufklären? 😃

Grüße

22.01.2009 - 14:25 Uhr

Danke für den Hinweis. - Leider funktioniert das auch nicht, indem man beim Linksklick die ContextMenu-Eigenschaft des NotifyIcon umlegt, um dann Show() aufzurufen. Ich denke ich werde es dann doch mit dem Linksklick-Menü bleiben lassen.

Gruß

22.01.2009 - 11:48 Uhr

Guten Tag,

zum Thema ContextMenu habe ich eine Frage: Ich habe mir eine TrayApplication zusammengeschustert. Dieser habe ich zwei verschiedene ContextMenus, jeweils für die rechte als auch für die linke Maustaste, zugewiesen. Die Klasse NotifyIcon hat eine Eigenschaft namens ContextMenu, der ich sogleich die Instanz der Klasse ContextMenu für die rechte Maustaste zugewiesen habe. Dieses ContextMenu für den Rechtsklick funktioniert auch so, wie man es von Windowsanwendungen her erwarten würde. Beim klicken mit der linken Maustaste auf das NotifyIcon im Tray hingegen habe ich das OnMouseClick-Event genutzt, um das entsprechende ContextMenu für den Linksklick aufzurufen. Und zwar so:


private ContextMenu leftMouseButtonMenu;
// Im Constructor instanziiert und so
private void OnLeftMouseButtonClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                leftMouseButtonMenu.Show(this, Control.MousePosition);
            }
        }

Das ganze klappt auch soweit und das ContextMenu für die linke Maustaste zeigt sich. Aber... es ist nicht mehr möglich dieses ContextMenu beim Wegklicken schließen zu lassen. Es schließt sich erst, wenn ein Eintrag im ContextMenu angeklickt wird. Jedoch möchte vielleicht jemand nichts in dem ContextMenu anklicken? Im ContextMenu für die rechte Maustaste hingegen, welches über das NotifyIcon verwaltet wird, schließt es sich beim Wegklicken, wie man es gewohnt ist.

Nun suche ich nach einer Möglichkeit das ContextMenu der linken Maustaste so verhalten zu lassen wie das der rechten. Eine Hide()-Methode wie auch Events werden nicht geboten. - Weiss da jemand Rat?

Auch habe ich daran gedacht auf die Klasse ContextMenuStrip auszuweichen, mit dieser habe ich aber das gleiche Problem. Zwar bietet ContextMenuStrip eine Hide()-Methode und auch ein LostFocus-Event, jedoch wird dieses Event nicht abgefeuert beim Wegklicken.

Grüße