Laden...
D
djCalypso myCSharp.de - Member
Fachinformatiker - Anwendungsentwicklung Köln Dabei seit 13.03.2007 96 Beiträge
Benutzerbeschreibung

Forenbeiträge von djCalypso Ingesamt 96 Beiträge

23.01.2013 - 11:20 Uhr

Guten Tag alle zusammen,

ich habe ein Programm geschrieben, welches sich mittels Win32 Funktion "SetParent" in ein anderes Fenster (externes Programm) hineinlegt.

Dieses Zusammenspiel gibt in einem Szenario einen mir unerklärlichen Fehler:

  1. Textbox des externen Programmes hat den Focus
  2. Mausklick auf ein Control von mir (welches in diesem externen Programm eingebettet wurde und den Focus bekommen kann)
  3. nach dem FocusLost der Textbox (des externen Programmes) wird durch das externe Programm ein modaler Dialog "#32770" aufgerufen.
  4. Sowohl meine Anwendung als auch der modale Dialog hängt sich auf.

Dieses Problem scheint durch einen Aufruf von Application.DoEvents (beim Erkennen, dass der "#32770" Dialog aufgerufen wird) gelöst zu sein... jedoch gibt es durch den Aufruf von Application.DoEvents andere Probleme (Events werden doppelt aufgerufen, COM-Exceptions, uvm.)

Das Problem lässt sich nur unter Windows 7/Windows Server 2008 reproduzieren... unter Windows Server 2003, etc. scheint das Problem nicht zu bestehen.

Weiss einer von euch Rat was ich noch machen könnte? Meine Vermutung wäre, dass sich die MessageLoop an einer Stelle aufhängt.

Per Callstack bleibt das Programm an folgender Stelle hängen:

Fehlermeldung:
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.Control.FocusInternal() + 0xa2 bytes
System.Windows.Forms.dll!System.Windows.Forms.Control.WmMouseDown(ref System.Windows.Forms.Message, System.Windows.Forms.MouseButtons, int) + 0x5e bytes
System.Windows.Forms.dll!System.Windows.Forms.Control.WndProc(ref System.Windows.Forms.Message) + 0x923 bytes
System.Windows.Forms.dll!System.Windows.Forms.ButtonBase.WndProc(ref System.Windows.Forms.Message) + 0x66 bytes
System.Windows.Forms.dll!System.Windows.Forms.Button.WndProc(ref System.Windows.Forms.Message) + 0x20 bytes
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.OnMessage(ref System.Windows.Forms.Message) + 0x13 bytes
System.Windows.Forms.dll!System.Windows.Forms.Control.ControlNativeWindow.WndProc(ref System.Windows.Forms.Message) + 0x31 bytes
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Callback(System.IntPtr, int, System.IntPtr, System.IntPtr) + 0x96 bytes
[Native to Managed Transition]
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System. Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(System.IntPtr, int, int) + 0x287 bytes
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(int, System.Windows.Forms.ApplicationContext) + 0x16c bytes
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop(int, System.Windows.Forms.ApplicationContext) + 0x61 bytes
System.Windows.Forms.dll!System.Windows.Forms.Application.Run() + 0x2e bytes
MeinProgramm.exe!Context.Run(string, string) Line 273 + 0x5 bytes C#
MeinProgramm.exe!Program.Main(string[]) Line 79 + 0x12 bytes C#

Gruß

27.07.2011 - 10:42 Uhr

Entschuldigung dafür, dass ich mich jetzt erst wieder bei euch melde...

Werde die Tage mal schauen, dass ich euch einen Link mit dem Code zur Verfügung stelle (das ganze wird dann aber ohne Grafiken zur Verfügung gestellt).

Bin gerade am überlegen, ob ich nicht noch ein neues Projekt bezüglich eines Players machen soll... (viellt. eine Art SDK für Webradios, um ihren eigenen Player mit einfachen Klicks fertig zu bauen)?

01.07.2011 - 11:39 Uhr

Hallo herbivore,

dachte da eher an einer Console oder sowas in der Art wie man solche Parent-Fehler zur Laufzeit je nachdem abfangen könnte... Würde nur zu gerne detailierter wissen was dort schief läuft.

Danke dennoch vielmals für eure Tipps.

01.07.2011 - 10:22 Uhr

Eine richtige Lösung habe ich für das Problem immer noch nicht, da es sich in dem oben genannten Szenario dennoch so verhält das es kaputt geht...
Scheint auf jeden Fall das gleiche Problem zu sein wie wenn ich dem Control im Konstruktor schon den ToolTip zuweise und noch kein Parent vorhanden ist.

Gibt es viellt. eine Möglichkeit Fehlermeldungen für solche Windows Probleme aufzufangen? Werden diese Probleme viellt. irgendwo gesammelt?

30.06.2011 - 16:15 Uhr

Habe noch etwas sehr merkwürdiges herausgefunden...
Wenn ich den ToolTip wie folgt definiere klappt er einwandfrei und der ToolStripDropDown weist keine Eigenart auf.


Label lblTest = new Label();
lblTest.Text = "MeinLabel";

this.Controls.Add(lblTest);

ToolTip tt = new ToolTip();
tt.SetToolTip(lbl, "Test");

Sobald ich nun den ToolTip vor dem this.Controls.Add erstelle klappt es nicht und beim ersten anzeigen des ToolTips weist die ToolStripDropDown diese Eigenart auf.


Label lblTest = new Label();
lblTest.Text = "MeinLabel";

ToolTip tt = new ToolTip();
tt.SetToolTip(lbl, "Test");

this.Controls.Add(lblTest);

30.06.2011 - 12:52 Uhr

Hey herbivore,

ja sollte Tooltip heißen. Sobald der Tooltip angezeigt wird und DANN erst ein ToolStripDropDown angezeigt wird (siehe Szenario oben) wird das Fenster was ein Child vom Parent Fenster ist hinter das Parent Fenster gelegt. Wenn ich Tooltips ausstelle und keiner angezeigt wird klappt es einwandfrei.

Werde jetzt noch einmal ein kleines Programm bauen und noch etwas rumprobieren... langsam aber sicher habe ich keinen Rat mehr für dieses Problem.

Danke schonmal für eure Lösungsvorschläge und euren Einsatz.

Gruß

29.06.2011 - 15:48 Uhr

Wenn noch Interesse besteht kann ich gerne den Code hier zur Verfügung stellen (war eines meiner ersten großen Projekte, die ich in C# gemacht habe)

29.06.2011 - 15:47 Uhr

Gerade noch einmal den Stand auf Windows 7 probiert und verursacht dort das selbe Problem...

Verdammt merkwürdig warum ausgerechnet die Tooltips dafür sorgen das sich ToolStripDropDown so eigenartig verhält

28.06.2011 - 11:57 Uhr

Folgende neue Erkentnisse habe ich eben noch herausgefunden:

Da wir unsere benutzerdefinierten Controls (.NET) in eine vorhandene Anwendung reinlegen entsteht das Problem nur genau in diesem Szenario. Sobald ich eine eigene Form mit dem Owner der vorhandenen Anwendung lege funktioniert alles einwandfrei und ohne Probleme (Externe Anwendung -> Form A -> Form B -> ToolStripDropDown).

Könnte es sein das der Tooltip beim 2ten anzeigen (wenn wir unsere Controls in andere Anwendungen hereinlegen) die Message Que/... zerschießen kann?

Sehr mysteriös das ganze...

Werde jetzt mal versuchen sobald der ToolStripDropDown angezeigt wird, dass ich von dem untersten Parent Control den Z-Index über das der vorhandenen Anwendung lege.

27.06.2011 - 17:42 Uhr

Hallo herbivore,

habe mir die Form per Spy++ als es noch nicht zerstört ist und wenn es zerstört ist (hinter dem Parent liegt) einmal angeschaut.

Der Parent/Owner verändert sich im funktionierenden oder zerstörenden Status nicht. Parent ist immer NULL und Owner ist die Parent Form vom Child.

Könnte es viellt. sein das wenn man Tooltips in einem anderen Thread (per Invoke in den GUI Thread) erstellt (SetTooltip) kaputt kriegen kann? Mich wundert es das wenn das 2te Tooltip angezeigt wird und das 1te laut .NET zerstört ist die Form Reihenfolge beim Aufruf vom ToolStripDropDown total zerstört. Sobald dieser ToolStripDropDown nach dem öffnen geschlossen wird ist die Reihenfolge wieder normal (beim Aufruf vom ToolStripDropDown wieder kaputt).

Mir scheint es so als würde irgend etwas Windows spezifisches für diesen Prozess kaputt gehen.

27.06.2011 - 13:46 Uhr

Hallo alle zusammen,

mir ist ein sehr merkwürdiges Phänomen aufgefallen wo ich auch nach längerer Recherche im Internet einfach keinen Rat mehr weiss... (Windows Server 2003 + Windows XP)

[Problembeschreibung]

Tooltip scheint die Parent/Owner Eigenschaft vom Child-Fenster zu zerstören, sodass wenn ein ToolStripDropDown im Child Form angezeigt wird diese Form hinter dem Parent Form landet und die Reihenfolge die normalerweise (Parent Form -> Child Form -> ToolStripDropDown) sein sollte als (Child Form -> Parent Form -> ToolStripDropDown) dargstellt wird.

[Aufbau der Anwendung]

Ich habe eine Anwendung (per Windows.Forms.Form), die je nachdem welche Bedingungen erfüllt ist andere Controls darstellt (mit verschiedenen darin enthaltenen Controls). Beim Wechsel einer Bedingung wird das alte Control disposed/entfernt und ein neues Control hinzugefügt. In jedem Control befindet sich ein Button auf dem ein eigen-erstellter Tooltip eingestellt ist (dieser Tooltip wird beim Dispose vom Tooltip disposed). Beim Klick auf den Button öffnet sich eine Form (per Windows.Forms.Form) auf der eine eigen-erstellte Liste (Textbox + ToolStripDropDown) enthalten ist. Beim Klick auf die Textbox öffnet sich ein ToolStripDropDown Menü mit selbst gezeichneten Items.

[Problem nachstellen]

Man lässt sich den 1ten Tooltip vom Button des 1ten Controls anzeigen und öffnet daraufhin die Form mit der darauf enthaltenen Liste. Beim Klick auf die Liste funktioniert alles einwandfrei (Parent Form -> Child Form -> ToolStripDropDown). Sobald man nun das Fenster schließt, die Bedingung ändert sodass sich das 1te Control zerstört und ein 2tes Control geladen wird scheint ein weiteres anzeigen des 2ten Tooltip vom Button des 2ten Controls die Reihenfolge vom ToolStripDropDown zu zerstören. Nach öffnen der Form beim Klick auf den Button wird das Child Form beim klicken auf die Liste in den Hintergrund der Parent Form gelegt (Child Form -> Parent Form -> ToolStripDropDown)

[Lösungsansätze, die bisher gescheitert sind]

Es wäre wirklich schön, wenn jmd. eine Lösung für dieses Problem hätte, da unsere Listen (mit ToolStripDropDown) unter Windows Server 2003/Windows XP nicht zumutbar sind. Unter Windows 7 scheint das Problem anscheinend nicht zu bestehen.

10.02.2011 - 15:13 Uhr

Hallo alle zusammen,

wie kann ich in einem TabControl den Abstand des Reiters von links einstellen? (Margin von den Reitern für links/rechts)?

Sinn ist es bei den Reitern links jeweils ca. 20 Pixel Abstand zu lassen (keine Klick-Logik im freien Feld vorhanden).

Hier mal ein Bild, damit man das ganze leichter versteht (habe schon bereits im Internet gesucht und keine passende Antwort dazu gefunden).

MfG Calypso

10.12.2010 - 14:50 Uhr

Scheint nun mit einem Invoke auf dem GUI-Thread zu funktionieren.

Danke für deine Hilfe Th69

10.12.2010 - 12:46 Uhr

Und wenn du nur die SendKeys.Send()-Methode benutzt? Oder mußt du explizit die Bearbeitung in deinem Programm abwarten?

Und noch als Frage: laufen beide Anwendungen in der VM oder übergibst du die Daten von außen an die VM?

SendKeys.Send sorgt dafür, dass der Text nicht 100 %tig eingefügt wird (deswegen wurden auch SendWait benutzt).
Selbst bei SendKeys.Send tritt das phänomen auf, dass das Betriebssystem einfriert... (im Internet finde ich zwar paar Foren, wo Leute das gleiche Problem haben, aber es gibt dort keine Lösungen...)

Beide Anwendungen laufen komplett in der VM.

Das merkwürdige ist das ich bei mir Windows 7 habe (lokal) und das ganze ohne Probleme funktioniert... unter der VM (Windows XP) treten die Probleme auf.

Wenn es viellt. noch eine andere Möglichkeit gäbe Sachen in das aktuelle Fenster einzufügen wäre mir auch schon geholfen. (nur mit den Win32 Funktionen wie SendMessage oder PostMessage läuft das ganze auch nicht einwandfrei).

10.12.2010 - 12:11 Uhr

Hallo alle zusammen,

mein Szenario ist, das ich einen Text in den Zwischenspeicher lege (Clipboard) und das Zielfenster (Outlook 2010) in den Vordergrund lege, um Texte einzufügen.

Danach führe ich ein "SendKeys.SendWait("^v");" auf, welches wohl bei mir in der VM dafür sorgt, das sich das Betriebssystem einfriert... sobald ich Windows Taste + D drücke scheint der gefrorene Zustand zu erlischen.

Gibt es noch eine andere Art den Einfüge-Mechanismus anders zu erledigen, sodass dieser auch zu 100 % ankommt und keine Probleme verursacht?

Grüße

Calypso

06.12.2010 - 17:56 Uhr

Hallo an alle,

gibt es eine Möglichkeit ComboBoxItems in ComboBoxItems zu verschachteln, sodass das ganze auch in der ComboBox untergruppiert dargestellt wird?

*Screenshot im Anhang*

Arbeite erst seit ein paar Tagen mit WPF und habe bisher noch kein richtiges Ergebnis erziehlt.
Ein Versuch war es das ganze als Textbox + Popup (ListBox) darzustellen, nur scheint es dabei mit der StaysOpen Eigenschaft massive Probleme zu geben...

22.09.2010 - 10:53 Uhr

Danke schonmal für eure Antworten 😉
Werde mich mal mit den Gebieten auseinander setzen.

22.09.2010 - 00:55 Uhr

Hallo alle zusammen,

ich frage mich gerade ob es sowas wie Seminare für die "Organisationsentwicklung" in Programmier-Teams gibt.

Sinn soll es sein Kentnisse über Wekzeuge wie Wiki, etc. zu erlangen und das ganze erfolgreich im Team zu vermitteln (bsp. Library erweitert, sodass jeder Programmierer diese Änderung erfolgreich mitbekommt und Funktionen sinvoll wiederverwendet werden können).

Viellt. hat jmd. Erfahrungen wie man das ganze noch anders managen könnte?

Liebe Grüße

15.09.2010 - 17:19 Uhr

Nachdem ich nun folgende Methode auskommentiert habe scheint es ohne flackern einwandfrei zu funktionieren 😃

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x20;
                return cp;
            }
        }
15.09.2010 - 16:27 Uhr

Hallo an alle,

ich habe zur Zeit folgendes Problem:

Mein UserControl beinhaltet zwei Panels wobei Panel1 mehrere Controls beinhaltet.

Wenn ich nun hingehe und in Panel2 irgendwo reinklicke, dann werden die Controls im Panel1 alle neu gezeichnet, welche dann durch folgenden StackTrace den OnPaint Aufruf bekommen:

[3960] bei MeinControl.OnPaint(PaintEventArgs e)
[3960] bei System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
[3960] bei System.Windows.Forms.Control.WmPaint(Message& m)
[3960] bei System.Windows.Forms.Control.WndProc(Message& m)
[3960] bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
[3960] bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
[3960] bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
[3960] bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
[3960] bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms. UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
[3960] bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
[3960] bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
[3960] bei System.Windows.Forms.Application.Run()

Meine Frage ist wie ich das deaktivieren kann, das er Controlübergreifend die anderen Controls neu zeichnet, obwohl nur ein einfacher Klick in einem anderen vollzogen wurde.

Liebe Grüße

12.07.2010 - 20:56 Uhr

Habe gerade paar Sachen dazu mal gelesen (warum das nicht funktioniert).
Scheint wohl so zu sein, dass die minimierten Programme keine Grafik besitzen und somit nicht ausgelesen werden können.
Die einzigen Möglichkeiten wären:

  • Programm kurz in den Vordergrund
  • Auf ein Event vom Programm reagieren (wenn sich etwas umschaltet und eine Art Cache des Control Bildes erstellen)
12.07.2010 - 20:37 Uhr

Erst einmal Danke für deine Antwort.
Das ganze funktioniert allerdings nur, wenn die Anwendung gerade sichtbar ist 😕
Wie kriegt man das mit der Print Funktion hin bei einem Control, welches gerade nicht sichtbar ist?

Meine Lösung sieht gerade wie folgt aus:

public partial class Form1 : Form
    {
        [DllImport("User32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);

        public Form1()
        {
            InitializeComponent();

            IntPtr hwnd = new IntPtr(131758);
            //Graphics g = Graphics.FromHdc(hwnd); //hwnd.CreateGraphics();
            Bitmap bmp = new Bitmap(500, 100);//, g);
            Graphics memoryGraphics = Graphics.FromImage(bmp);
            IntPtr dc = memoryGraphics.GetHdc();
            bool success = PrintWindow(hwnd, dc, 0);
            memoryGraphics.ReleaseHdc(dc);
            pictureBox1.Image = bmp;
        }
    }

Habe gerade nochmal etwas getestet.
Das ganze funktioniert dann nicht mehr, wenn das Fenster "minimiert" ist bsp. Outlook.
Das Bild wird dann scharz dargestellt.

Das Beispielprogramm habe ich noch entdeckt, allerdings klappt das ganze auch nur dann, wenn man das Fenster kurz Visible setzt (unschön)

http://www.codeproject.com/KB/cs/CapturingMinimizedWindow.aspx

12.07.2010 - 18:21 Uhr

Hallo alle zusammen 😃

wie kriege ich es hin von einem nicht sichtbaren Fenster (nicht meine eigene Anwendung) ein Bitmap zu erstellen? Gibt es Möglichkeiten mit Win32 GDI+ daran zu kommen?

Habe von dem Control das Handle (per Spy++)

Ich wäre über Hilfe sehr dankbar.

Liebe Grüße

10.02.2010 - 11:12 Uhr

Vielen Dank herbivore, nun klappt es relativ schnell 😃
Nur schade das die TreeView selbst keine gute Performance Lösungen parat hat.

09.02.2010 - 22:29 Uhr

Guten Abend,

bevor ich auf mein Problem zu sprechen komme sei erwähnt, das ich mich schon vorher darüber informiert habe und leider keinen passenden Thread finde in der das Problem gelöst wird.

Bei mir ist derzeit der Fall, dass ich eine TreeView benutze und mit ca. 400.000 Datensätzen arbeite.
Das Hinzufügen, Bearbeiten und Löschen klappt soweit wunderbar, jedoch lässt die Performance zu Wünschen übrig.
Derzeit braucht das Programm bei ca. 400.000 Datensätzen um die 5 - 10 Sekunden um einen TreeNode (innerhalb der TreeView) zu bearbeiten (TreeNode.Text).

Gibt es eine Möglichkeit wie ich einen TreeNode.Text innerhalb einer TreeView ohne Performance-Verlust bearbeiten/updaten kann?

Folgender Code füllt erst einmal eine TreeView und durch einen Rechtsklick auf einen TreeNode (ContextMenuStrip) lässt sich an dem TreeNode.Text ein "." Zeichen hinzufügen.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            treeView1.BeginUpdate();

            TreeNode tn = new TreeNode("ROOT");
            tn.ContextMenuStrip = contextMenuStrip1;
            treeView1.Nodes.Add(tn);
            FillTreeView(8, tn);
            
            treeView1.EndUpdate();

            MessageBox.Show(treeView1.GetNodeCount(true).ToString());
        }

        private void FillTreeView(Int32 x, TreeNode tn)
        {
            if (x > 0)
            {
                x--;
            
                for (Int32 i = 0; i < 5; i++)
                {
                    TreeNode tnChild = new TreeNode("Node " + i);
                    tnChild.ContextMenuStrip = contextMenuStrip1;
                    tn.Nodes.Add(tnChild);
                    FillTreeView(x, tnChild);
                }
            }
        }

        private void textChangeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (treeView1.SelectedNode != null)
            {
                treeView1.BeginUpdate();
                treeView1.SelectedNode.Text += ".";
                treeView1.EndUpdate();
            }
        }
    }
}

Ich wäre über eine Lösung sehr dankbar, da ich so langsam keinen Rat mehr weiss. =/

23.11.2009 - 17:48 Uhr

Also der Player so wie er sich jetzt befindet wird nicht mehr von mir weiterentwickelt (gewisse Gründe...)!

Und zu byob: Manche Personen sind es selbst schuld das sie nichts mehr am Projekt machen, weil sie a) nichts beigetragen haben b) nur kopieren können c) sich asozial gegenüber dem Team verhalten (denk mal darüber nach...)

Bin schon am überlegen, ob ich irgendwann ein ähnliches Projekt umsetzen werde.
Denke auch das wenn die Zeit gekommen ist, das ich den T4E Player so wie er gerade ist in etwa als freien Code veröffentliche...

05.02.2009 - 09:17 Uhr

Keiner der mir hier viellt. helfen könnte? 😦

03.02.2009 - 13:42 Uhr

Die Sache ist ja das die Summe stimmt.
Der verhunzt auch immer nur das letzte Row, wenn ich AutoScroll = true; habe.

TableLayoutPanel = Height von 602 px;

Row1 = Absolute mit 300 px
Row2 = Aboslute mit 2 px
Row3 = Absolute mit 300 px

nun ändere ich in der Laufzeit

Row1 = Absolute mit 420 px
Row2 = Aboslute mit 2 px
Row3 = Absolute mit 180 px

dann ändert er Row1 und Row2, das Row3 bleibt allerdings bei 300 px und er fängt an zu scrollen.

Langsam verzweifel ich an dem ganzen hier =/

03.02.2009 - 12:04 Uhr

Hallo,

zur Zeit benutze ich das TableLayoutPanel und füge dort 3 Zeilen ein.

Row1 = Absolute mit 300 px
Row2 = Aboslute mit 2 px
Row3 = Absolute mit 300 px

soweit klappt auch alles ziemlich gut.
Absolute heißt für mich das ich feste Größen angeben kann.

Immer dann wenn ich in Row1 ein paar Elemente einfüge und Row1 verändern möchte von der Größe:

z.B: Row1 = Absolute mit 420 px und Row3 = Absolute mit 180 px = 600 px wie oben.

fängt er an rumzuspinnen.
Mit rumspinnen meine ich, dass Row3 sich nicht verändert... warum auch immer. Es bleibt 300 px, obwohl ich 180 px eingestellt habe und die ScrollBar erscheint.

Wenn ich nun AutoScroll = False; setze klappt alles wunderbar und er verändert auch die Größe von Row3.

Wie ich das gesehen habe scheint das immer ein Problem des Last Row zu sein, welches sich im TableLayoutPanel befindet.
Selbst wenn ich eins mit 5 px reinzimmer stellt er das größer da als es eingestellt ist.

Ich hoffe das mir hier ein paar Leute helfen könnten.

Greetz Calypso

03.02.2009 - 10:47 Uhr

Nun ist schon etwas Zeit vergangen 😃
Werde den Player bald mal als OpenSource zur Verfügung stellen mit einigen Veränderungen.

09.09.2008 - 09:39 Uhr

Naja Google sagt schon alles.
Wie ich mitbekommen habe plant sogar Studivz nun nen Messenger zu basteln.

Ich denke ich werde die Tage mal versuchen mich etwas mit Miranda zu beschäftigen. Wäre extrem praktisch, wenn man Studivz im Miranda hätte als Protokoll.
Falls wie gesagt jmd. Interesse an solch einem Projekt hat kann er mich gerne anschreiben.

05.09.2008 - 10:00 Uhr

Hallo alle zusammen,

ich habe eben schon per Google & Co nachgeschaut nur leider keine wirklichen Infos gefunden.
Weiß einer von euch viellt. wie man ein Miranda Protokoll erstellen kann oder ob sowas mit C# überhaupt möglich ist?

MfG Calypso

05.09.2008 - 09:39 Uhr

Okey, mit SNM hast du Recht das klingt nicht so pralle.
Habe noch ein bisschern herumprobiert und schon bisschen was geschafft.

www.calyphornia.de/snm.rar

Man kann sich nun einloggen und sieht rechts an der Seite immer die aktuelle Online Liste (Refresh alle 10 Sekunden).

Werde die Tage noch weiter daran arbeiten.

Hätte noch jmd. Interesse bei diesem kleinen Projekt mitzuarbeiten?

02.09.2008 - 12:01 Uhr

Den Login habe ich nun hinbekommen nach langem hin und her.

        public struct UserLoginData
        {
            public string email;
            public string password;
            public string formkey;
            public string iv;
            public string checkcode;
        }

        private CookieContainer cookies = new CookieContainer();

        private bool isLogin = false;

        public Form1()
        {
            InitializeComponent();
        }

        private UserLoginData GetUserLoginData(String html)
        {
            string searchValue;
            UserLoginData userLoginData = new UserLoginData();

            // Email
            userLoginData.email = textBox1.Text;
            
            // Password
            userLoginData.password = textBox2.Text;

            // Formkey
            searchValue = "<input type=\"hidden\" name=\"formkey\" value=\"";
            html = html.Substring(html.IndexOf(searchValue) + searchValue.Length);
            userLoginData.formkey = html.Substring(0, html.IndexOf("\" />"));
            
            // IV
            searchValue = "<input type=\"hidden\" name=\"iv\" value=\"";
            html = html.Substring(html.IndexOf(searchValue) + searchValue.Length);
            userLoginData.iv = html.Substring(0, html.IndexOf("\" />"));
            
            // Checkcode
            searchValue = "<input type=\"hidden\" name=\"checkcode\" value=\"";
            html = html.Substring(html.IndexOf(searchValue) + searchValue.Length);
            userLoginData.checkcode = html.Substring(0, html.IndexOf("\" />"));

            return userLoginData;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (isLogin)
            {
                VisitPage("http://www.meinvz.net/Groups");
            }
            else
            {
                Login();
            }
        }

        private void Login()
        {
            Uri uri = new Uri("http://www.meinvz.net");
            CookieContainer cookieContainer = new CookieContainer();
            UserLoginData userLoginData;

            // Infos auslesen
            HttpWebRequest sessionRequest = (HttpWebRequest)WebRequest.Create(uri);
            sessionRequest.CookieContainer = new CookieContainer();
            cookies = sessionRequest.CookieContainer;
            HttpWebResponse sessionResponse = (HttpWebResponse)sessionRequest.GetResponse();
            StreamReader checkReader = new StreamReader(sessionResponse.GetResponseStream());
            userLoginData = GetUserLoginData(checkReader.ReadToEnd());
            checkReader.Close();
            sessionResponse.Close();
        
            // Einloggen
            string loginData = "email=" + userLoginData.email;
            loginData += "&password=" + userLoginData.password;
            loginData += "&login=Einloggen";
            loginData += "&jsEnabled=false";
            loginData += "&formkey=" + userLoginData.formkey;
            loginData += "&iv=" + userLoginData.iv;
            loginData += "&checkcode=" + userLoginData.checkcode;
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.meinvz.net/Login");
            req.CookieContainer = cookies;
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] loginDataBytes = encoding.GetBytes(loginData);
            req.ContentLength = loginDataBytes.Length;
            Stream stream = req.GetRequestStream();
            stream.Write(loginDataBytes, 0, loginDataBytes.Length);
            stream.Close();
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            res.Close();
            isLogin = true;

            VisitPage("http://www.meinvz.net/Start");
        }

        private void VisitPage(string url)
        {
            string html;
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
            req.CookieContainer = cookies;
            req.Method = "GET";
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(res.GetResponseStream());
            html = sr.ReadToEnd();

            webBrowser1.Document.Body.InnerHtml = html;
        }

Es ist nun auch möglich, andere Seiten mit diesem Cookie zu besuchen 🙂 mit VisitPage!
Werde die Tage mal ein bisschen herumpfeilen und schauen was für Infos ich mir dann auslesen lasse.

Interessant wäre es herauszulesen, welche Personen gerade online sind.

Habt ihr noch ein paar Wünsche, die ihr gerne mit einem solchem Programm haben wollt?

PS: Was haltet ihr von dem Projektnamen: mySNM = my Social Network Messenger?

02.09.2008 - 10:20 Uhr

Habe das eben einmal probiert umzusetzen wie ich denke, jedoch irgendwie ohne Erfolg.

Ich habe zu Beginn ein Post Request mit email/password an meinvz geschickt und den CookieContainer vorher beim request festgelegt.
Schreibt der nach dem schreiben des Streams den Cookie in den Container oder müsste ich das selber managen?

Bisher habe ich noch nie so wirklich mit Cookies & C# gearbeitet, deswegen bin ich da etwas unerfahren.

Hier mein kurzes Beispiel.

        private CookieContainer cc = new CookieContainer();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            LoginPost();

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.meinvz.net");
            request.CookieContainer = cc;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream stream = response.GetResponseStream();
            string tempString = null;
            int count = 0;
            StringBuilder sb = new StringBuilder();
            byte[] buf = new byte[8192];

            do
            {
                count = stream.Read(buf, 0, buf.Length);

                if (count != 0)
                {
                    tempString = Encoding.UTF8.GetString(buf, 0, count);
                    sb.Append(tempString);
                }
            }
            while (count > 0);

            richTextBox1.Text = sb.ToString();
        }

        private void LoginPost()
        {
            string email = textBox1.Text;
            string password = textBox2.Text;

            ASCIIEncoding encoding = new ASCIIEncoding();
            string postData = "email=" + email;
            postData += "&password=" + password;
            byte[] data = encoding.GetBytes(postData);

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.meinvz.net");
            request.CookieContainer = cc;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = data.Length;
            Stream stream = request.GetRequestStream();
            stream.Write(data, 0, data.Length);
            stream.Close();
        }

Habe eben entdeckt, das Meinvz das ganze über eine PHPSESSID im Cookie macht.
dann bräuchte man ja eigentlich nur die PHPSessid zu bekommen und braucht nichts mit Cookies rumfuchteln.

01.09.2008 - 11:01 Uhr

Bei einem Captcha könnte man ja erst einmal so reagieren, das der User eine Art Fenstereingabe bekommt, wo dieses Captcha angezeigt wird und auf die richtige Eingabe wartet. Da hilft wahrscheinlich nur probieren und austesten, damit man solche Sachen durch eine Programmlogik ersetzt.

01.09.2008 - 10:57 Uhr

Ein kleines Projekt wie du schon meintest könnte man auf jeden Fall daraus machen (OpenSource).
Interesse besteht auf meiner Seite auf jeden Fall 🙂
Namen kann man ja im Endeffekt auch noch finden, muss ja nicht der Name VZ vorhanden sein. Bsp. "Social Network Messenger" oder soetwas ähnliches.

Man könnte bei einem solchen Projekt viellt. so ähnlich wie bei Miranda machen, wo man diese verschiedenen Webseiten "Vz, Kwick, Myspace, ..." per Plugin einbindet.

Ich werde das nachher einmal testen, ob ich das soweit hinbekomme, das ich eine Art Login Routine mit C# dafür geschrieben bekomme. (Cookies)

01.09.2008 - 10:43 Uhr

Danke Ploetzi,

folgendes Beispiel habe ich eben gefunden.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("URL");
CookieContainer cc = new CookieContainer();
cc.Add(cookie);
request.CookieContainer = cc;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Müsste man halt nur nen globalen Cookie für die Laufzeit erstellen und bei jedem Abruf mitsenden wie ich denke.
Hat hier denn schon jmd. gute Cookie Erfahrungen wie ich sowas ziemlich gut umsetzen könnte?
Ansonsten müsste ich mal bei MSDN, etc. im Web gucken wie ich sowas realisiere.

01.09.2008 - 10:05 Uhr

Hallo alle zusammen,
ich habe demletzt gesehen, dass GMX eine Art Multi Messenger hat auf dem man permanent eingeloggt ist und die Messages von diesen Sozialen Netzwerken direkt bekommt.
Nun frage ich mich, wie man solche Infos auf deren Page ausliest.
Ich könnte mir momentan nur vorstellen, das eine Art Webbrowser Client in diesem Programm vorhanden ist, welcher durchgehend checkt, ob es neue Infos gibt, etc.

Vielleicht habt ihr noch ein paar weitere Ideen, denn ich möchte mir einen solchen Messenger für den Privatgebrauch selber basteln.

29.07.2008 - 22:44 Uhr

Was hat das denn bitte mit eigener Schuld zutuen?
Wer würde dabei denken, das ein ToolTip einer DataGridView das ganze Programm zerstört.

28.07.2008 - 09:44 Uhr

Nach langem hin und her ist das Problem behoben.

DataGridView.ShowCellToolTips macht die Z-Reihenfolge bei den Fenstern kaputt, sobald ein ToolTip auch nur kurz angezeigt wird.

Microsoft ...

22.07.2008 - 18:40 Uhr

Es handelt sich um ein CRM System, welches Dialoge (Forms) aufruft und diese einen Owner auf das CRM System haben.
Nun schreibe ich eigene Programme dafür, damit ich selber eigene Dialoge (Forms) dort öffnen kann. Diese Programme haben auch den Owner auf das CRM System. Jedoch gibt es nach einiger Zeit wieviele Aktionen man macht oder innerhalb des eigenen Programmes neue Formen aufruft gewaltige Probleme.

Die CRM Dialoge (Forms) verhalten sich dann extrem merkwürdig und verschwinden wenn sie aktiv sind.
Sobald ich aber mein eigenes Programm schließe ist alles wieder normal.

Finde nur leider momentan die Stelle nicht wie er dort was verändern soll.

Per Spy++ habe ich schon probiert die Eigenschaften/Events abzufangen, jedoch irgendwie ohne wirklichen Erfolg.

Gibt es noch ein Programm, was man zur Analyse von solchen Problemen benutzen kann?

22.07.2008 - 17:05 Uhr

Ich habe da mal eine Frage, da ich momentan auf ein Problem gestoßen bin das irgendwie sowas von unerklährlich ist wie nichts anderes.

Hauptfenster ist offen und indem kann man sogenannte Dialoge öffnen.
Diese Dialoge funktionieren auch momentan noch soweit.
Wenn ich nun ein eigenständiges Programm dort reinsetze und das Hauptfenster deren Owner ist und einige Dialoge/Aktionen innerhalb des eigenständigen Programmes öffne/starte, dann verändern die Dialoge sich vom Hauptfenster.

D.h. wenn ich einen Dialog anklicken, dann springt dieser hinter das Hauptfenster und ist dennoch aktiv. Wenn ich nun das Hauptfenster oder einen anderen Dialog anklicke, dann kommt dieses Dialog wieder in den Vordergrund und ist inaktiv.

Nun meine Frage, womit kann ich am besten überprüfen was da genau schief läuft und wie ich das je nachdem wieder richtig hinbekomme. Habe momentan schon spy++ probiert, jedoch ohne richtigen Erfolg.

Mit freundlichen Grüßen

Calypso

10.07.2008 - 12:35 Uhr

Gibt es eine Möglichkeit bei einem Prozess.Kill oder wenn jmd. per Task Manager einen Prozess beendet, dass man eine Art Event oder sowas in der Art mitbekommt?
Problem ist das ein Programm von einem anderen abhängig ist und wenn man dann den Prozess killt, das dieser momentan nichts mitbekommt und weiter bestehen bleibt, bis er durch Zufall merkt, das der andere Prozess weg ist.

Ich wäre über Antworten sehr dankbar.

MfG Calypso

27.06.2008 - 09:38 Uhr

Hmm sehr schade das ich bisher noch keine Antwort/Lösung erhalten habe.

Gibt es eigentlich eine Möglichkeit von einem WebBrowser Steuerelement auf ein EMBED zuzugreifen und zu prüfen, ob es gerade läuft?

Das würde mir schon gravierend weiterhelfen oder wie ich je nachdem eine SWF Datei Cachen kann um diese beim Einbau in das WebBrowser Control direkt abspielen zu können.

MfG

Calypso

26.06.2008 - 11:29 Uhr

Hallo alle zusammen.
Momentan stoße ich auf ein Hindernis.
Undzwar baue ich in mein Programm ein WebBrowser Control ein und lade damit eine Webseite wo eine Flash Animation vorhanden ist.
Die Flash Animation wird auch schön dargestellt, allerdings dauert das ganze Stück ca. 5 Sekunden bis es anfängt die Flash Animation abzuspielen.

Wie kriege ich es hin ein Event mitzubekommen, dass dieses Flash Video gerade abgespielt wird (von der ersten Sekunde an ohne Ladezeiten, weil ich dort ein Bild vorher für die Wartezeit einbauen wollte) und wie bekomme ich mit das dieses Flash Video gerade zuende geladen ist?

Ich wäre über eine Antwort sehr erfreut, bisher kann ich mir nur erdenken das es teilweise mit Windows Hooks realisierbar ist, aber diese Thematik führt auch ein paar Probleme mit sich.

MfG

Calypso

14.03.2008 - 08:55 Uhr

Titelanzeige im MSN Messenger Status:

Folgender Code ist dafür da, um den MSN Messenger Status zu ändern. Ist besonders dann praktisch, wenn man sich einen Player, etc. zusammenbastelt. Da ich das bei MSN bisschen unpraktisch fand, hab ich den Artisten mit dem Track getauscht, damit am Ende da steht: Artist - Titel!


        [System.Runtime.InteropServices.DllImport("user32", EntryPoint = "SendMessageA")]
        private static extern int SendMessage(int Hwnd, int wMsg, int wParam, int lParam);

        [System.Runtime.InteropServices.DllImport("user32", EntryPoint = "FindWindowExA")]
        private static extern int FindWindowEx(int hWnd1, int hWnd2, string lpsz1, string lpsz2);

        private const short WM_COPYDATA = 74;

        public struct COPYDATASTRUCT
        {
            public int dwData;
            public int cbData;
            public int lpData;
        }

        public int VarPtr(object e)
        {
            System.Runtime.InteropServices.GCHandle GC = System.Runtime.InteropServices.GCHandle.Alloc(e, System.Runtime.InteropServices.GCHandleType.Pinned);
            int gc = GC.AddrOfPinnedObject().ToInt32();
            GC.Free();
            return gc;
        }

        public void SetMessengerTrack(String artist, String title)
        {
                COPYDATASTRUCT theData;
                int hMSGRUI = 0;
                string buffer = "\\0Music\\01\\0";
                buffer += "{0} - {1}";
                buffer += "\\0";
                buffer += artist; // TITEL
                buffer += "\\0";
                buffer += title; // ARTIST
                buffer += "\\0";
                buffer += ""; // ALBUM
                buffer += "\\0";
                buffer += "";
                buffer += "\\0\\0";

                theData.dwData = 0x0547;
                theData.lpData = VarPtr(buffer);
                theData.cbData = (buffer.Length * 2) + 2;

                do
                {
                    hMSGRUI = FindWindowEx(0, hMSGRUI, "MsnMsgrUIManager", null);

                    if ((hMSGRUI > 0))
                    {
                        SendMessage(hMSGRUI, WM_COPYDATA, 0, VarPtr(theData));
                    }
                }
                while (!((hMSGRUI == 0)));
        }

Schlagwörter: MSN, Windows Live Messenger, Messenger, MSN Send Message

13.03.2008 - 09:29 Uhr

Hallo Stu42,
danke für deine Antwort.

Ich habe das natürlich nicht als x86 compiliert =/ sondern "any cpu".
Bisher wusste ich gar nicht das man das so einstellen kann.
Werde das nachher mal testen und bescheid geben.
Das wäre natürlich hammer, wenn es nun keine Probleme mehr gibt.

Wie schaut es eigentlich wegen den rechtlichen Sachen aus, gibt es da irgend welche Einschränkungen die man beachten sollte? (Patent, Lizenzen, etc.) ?

10.03.2008 - 10:05 Uhr

Hallo alle zusammen,

ich hätte da mal eine Frage bezüglich Flash (.swf)

  • gibt es rechtliche Aspekte die man einhalten sollte für Freeware ? (Patent, Lizenzen, etc.) ?
  • welches SDK nutzt man am besten, damit es keine Probleme unter 32/64 Bit + Vista gibt?

Demletzt hatte ich schonmal etwas umgesetzt, da war aber das Problem das dieses nicht unter Vista 32/64 Bit gelaufen ist.

Ich wäre für Tipps, Hinweise, Lösungen sehr dankbar.

MfG Calypso

09.11.2007 - 14:38 Uhr

Werde die Tage mal schaun, wie ich das Problem beheben könnte ^^