Laden...
-
-Hades- myCSharp.de - Member
Deutschland NRW Dabei seit 05.11.2007 171 Beiträge
Benutzerbeschreibung

Forenbeiträge von -Hades- Ingesamt 171 Beiträge

10.10.2009 - 17:29 Uhr

Vielen Dank Marsti!

Das hatte ich so auch schon gemacht, nur leider is dann wieder ein Rand zu sehen, den ich auch nicht ansteuern kann.
Oder kann ich diesen irgendwie invisible machen?

10.10.2009 - 03:32 Uhr

Hallo,

ich habe eine Form ohne Control Box. Ich möchte damit einen transparenten Kasten machen, so dass man sieht was gerade gewählt ist (mit einer lupe ohne vergrößerung vergleichbar 😉 ).
Das Problem ist jetzt das ich ohne Control Box die Größe nicht ändern kann. Hat da wer eine Idee, vielleicht über n toolstrip oder so? Oder ist es möglich die Control Box unsichtbar zu bekommen?

Bin für jede Idee offen, gruß -Hades-

21.09.2009 - 19:00 Uhr

Hi Leute,

ich suche eine schnelle und einfache Methode, um Bildschirminhalt in ein Bitmap zu bekommen.
Jetzt hab ich mir folgende Methode geschrieben, in der ich DirectDraw benutze und auch zufriedenstellend schnell ist.


public Bitmap FromScreen(Rectangle rect)
{
	Bitmap bmp = new Bitmap(Width, Height);
	Graphics g = Graphics.FromImage(bmp);

	Desktop_Surface.DrawToDc(g.GetHdc(), bitmap_rect, desktop_rect);
	g.ReleaseHdc();
}

Das Problem ist jetzt, dass ich alle paar male eine "CannotCreateDeviceContext" Exception bekomme und einfach nicht weiß warum.
Soviel ich weiß ist es aber nicht g.GetHdc sonder der DrawToDC befehl, der die Exception schmeißt.

Wäre cool, wenn jemand die Lösung oder eine andere einfache und schnelle Methode kennt.

MfG -Hades-

18.09.2009 - 14:59 Uhr

Vielen Dank an euch alle, das wird mir weiterhelfen.

Gruß -Hades-

17.09.2009 - 20:01 Uhr

Hallo,

wie ihr im Titel sehen könnt suche ich eine Routine für Imageprocessing. Ich möchte den Kontrast eines Bildes verändern können.
Wenn jemand schon mal sowas geschrieben hat oder eine leicht einzubindende Bibliothek kennt wäre ich sehr dankbar.

MfG Hades

02.06.2009 - 01:15 Uhr

Hallo zusammen,

ich habe folgendes vor. Ich möchte eine Art Cheattool bauen für ein Spiel bauen. Die Idee hatte ich schon länger und ich wollts einfach mal versuchen. Also das Spiel starte ich aus meiner Anwendung per Process.start() heraus.
Jetzt wollte ich erstmal ein paar Methoden schreiben mit denen ich für mich wichtige Speicheroffsets finde.
Ich wollte die ReadProcessMemory aus der kernel32 benutzen. So, jetzt müsste ich aber erstmal die Grenzen des von dem Programm allokierten Speichers kennen. Gibt es dafür eine Möglichkeit das abzufragen? Ich habe auch noch die OpenProcess Methode gefunden, bei der ich angeben kann inwiefern ich auf den Speicher zugreifen kann, weiß allerdings nicht genau wie ich diese für meine Zwecke einsetze oder ob ich sie überhaupt brauche.

Wenn ich jetzt die Speicher-ranges des Programms gefunden habe, wollte ich in einem Zustand den kompletten Speicher lesen, dann ein kleines Detail verändern und den Speicher nochmal komplett lesen um so die Offsets zu finden an denen es eine Veränderung gab, um so z.B. die Hitpoints mittels WriteProcessMemory zu verändern oder dergleichen. Ist diese Vorgehensweise nachvollziehbar und sogar möglich oder verrenne ich mich damit völlig?

Wäre super wenn mir da jemand weiterhelfen könnte.

(Ich habe ReadProcessMemory einfach mal aufgerufen und als Adresse eine 1 übergeben und eine Range von 5, das hatte aber nach Aufruf von Marshal.GetLastWin32Error() eine Meldung zur Folge die besagt das die ReadProcessMemory Methode nur teilweise abgeschlossen werden konnte. Das is so ja auch völlig sinnlos alles.)

Gruß Hades

13.05.2009 - 19:57 Uhr

Also das habe ich heute Mittag schon geändert mit den Connections. Es wird nur noch eine einzige Connection überall benutzt. Die DataTable kommt aus dem Dataset das zuvor durch den DataAdapter gefüllt wurde, ich habe auch Dataset von der DataTable geprüft, es ist das richtige Dataset.

So, von EndEdit höre ich zugegeben gerade zum ersten mal und wie überprüfe ich das der Adapter das richtige Schema hat? Also Adappter, Dataset und DataTable passen alle schon zusammen...

13.05.2009 - 19:18 Uhr

So, also Update gibt immer 0 zurück, es wird also tatsächlich nichts in die Datenbank geschrieben. Im Datagridview sind die neuen Zeilen allerdings eingefügt und sichtbar...

13.05.2009 - 12:54 Uhr

Hallo BerndFfm,

das mit der Zahl werde ich später mal ausprobieren, hab leider im Moment keine Möglichkeit dazu.
Einen Try/ catch wo ich Fehlermeldungen nicht anzeigen lassen würde gibt es nicht. Den Fehler mit dem Primary Key hatte ich zuerst, da bekam ich die Meldung das der Select command ein Primary Key benötigt oder so ähnlich, das habe ich dann abgeändert und dann war der Fehler auch futsch. Das der index bereits vorhanden ist ist auch auszuschließen, da die Sachen die ich einfüge (ID) der Primary Key ist. Außerdem ist die Datenbank ja immer wieder komplett leer, also die Struktur ist noch da, jedoch sind die tabellen leer.

Das mit den Berechtigungen könnte ja sein, da habe ich leider wenig Ahnung wie ich das abchecke. Könntest du mir da noch einmal behilflich sein?
Edit: Also ich habe die Datenbank vorher ja per Code erzeugt, soviel Berechtigung hatte ich da also schonmal...

Gruß und Dank Hades

13.05.2009 - 00:04 Uhr

Hat denn niemand eine Ahnung woran es liegen könnte? Ich verzweifel hier langsam... Ich bin alle mehrmals durchgegangen und finde einfach nichts.

12.05.2009 - 21:42 Uhr

Vielen Dank für eure Antworten schonmal.
Ich habe den Scope-Abschnitt jetzt etwas anhand eurer Hilfen modifiziert und sieht jetzt folgendermaßen aus:


            using (System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder(db_ctrl.StatistikenDataAdapter))
            {
                SqlConnection statistiken_con = new SqlConnection("Server=.\\SQLExpress;Integrated security=SSPI;Database = Statistiken");
                statistiken_con.Open();
                db_ctrl.StatistikenDataAdapter.Update(db_ctrl.StatistikenDataSet);
                statistiken_con.Close();
            }

Leider hat auch dies keinen Effekt gehabt.
Das die Datenbank jedesmal neu erstellt wird oder dergleichen ist 100%tig auszuschließen.
Selbst wenn ich die Form mit dem Datagridview gerade sichtbar habe, etwas einfüge, die Form schließe (nicht die Applikation) und wieder anzeigen lasse ist sie wieder leer.

Ich hoffe ihr könnt mir dabei noch einmal helfen.

Gruß Hades

12.05.2009 - 17:14 Uhr

verwendetes Datenbanksystem: SQL Server 2005

Hallo,

ich habe folgendes Problem:

Ich habe ein Datagridview auf meiner Form und Binde es an eine Tabelle einer selbst erstellten Datenbank.
Ich habe mir ein Dataset und ein DataAdapter angelegt. Das Dataset fülle ich mittels folgendem Code:


            statistiken_con.Open();
            StatistikenDataSet = new DataSet("SatisticsDataSet");
            StatistikenDataAdapter = new SqlDataAdapter(select_from_all_tables, statistiken_con);
            StatistikenDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            StatistikenDataAdapter.TableMappings.Add("Table", "Overall");
            StatistikenDataAdapter.Fill(StatistikenDataSet);
            statistiken_con.Close();

So, die Struktur wird auch richtig im Datagridview angezeigt und ich habe mir zusätzlich eine kleine Methode geschrieben die eine Testzeile in die Datenbank einfügt, und die Veränderungen mit Hilfe eines CommandBuilders und des DataAdapters in die Datenbank schreibt, das passiert so:


            int current_id;
            DataTable Overall = db_ctrl.StatistikenDataSet.Tables["Overall"];
            if (Overall.Rows.Count == 0)
            {
                current_id = 0;
            }
            else
            {
                current_id = (int)Overall.Rows[Overall.Rows.Count - 1].ItemArray.GetValue(0);
            }

            //einfügen
            Overall.Rows.Add(current_id + 1, 0);
            Overall.AcceptChanges();
            db_ctrl.StatistikenDataSet.AcceptChanges();
            // Änderungen in die Datenbank schreiben
                    SqlConnection statistiken_con = new SqlConnection("Server=.\\SQLExpress;Integrated security=SSPI;Database = Statistiken");
                    statistiken_con.Open();
            using (System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder(db_ctrl.StatistikenDataAdapter))
            {
                db_ctrl.StatistikenDataAdapter.UpdateCommand = cb.GetUpdateCommand();
                db_ctrl.StatistikenDataAdapter.DeleteCommand = cb.GetDeleteCommand();
                db_ctrl.StatistikenDataAdapter.InsertCommand = cb.GetInsertCommand();
                db_ctrl.StatistikenDataAdapter.Update(db_ctrl.StatistikenDataSet);
            }
            statistiken_con.Close();
        }

Wenn die neue Zeile eingefügt wird sehe ich das auch alles einwandfrei im Datagridview. Wenn ich die Form allerdings schließe und sie wieder öffne, wobei wieder das Dataset angelegt und gefüllt wird ist es wieder leer. Auch wenn ich die Applikation beende und neu starte. Das heißt die Update-Methode über den CommandBuilder funktioniert wohl nicht wirklich. Das CommandBuilder-Objekt ist nicht null und ich bekomme auch keine Fehlermeldung....

Ich hoffe mir kann da jemand weiterhelfen.

Gruß Hades

06.05.2009 - 19:36 Uhr

Hat da niemand eine Ahnung warum ich die Meldung bekomme?

06.05.2009 - 17:28 Uhr

Ja super, das hat soweit geklappt und ich verstehe auch was ich da falsch gemacht habe.
Jetzt habe ich aber ein neues Problem bekommen.
Wenn ich meine Applikation starte und die Datenbank schon existiert kann ich sie wie gewünscht mit DROP löschen. Danach kann ich sie auch neu anlegen.
Wenn ich jetzt allerdings versuche sie erneut zu löschen bekomme ich die Meldung , dass die Datenbank nicht gelöscht werden kann da sie zur Zeit verwendet wird.
Erst wenn ich meine Apllikation neu starte geht es wieder.

Die SQLConnections sind alle per Close() geschlossen.
Ich hoffe das war dann vorerst mein letztes Anliegen.

Gruß Hades

06.05.2009 - 15:43 Uhr

Hmm also jetzt bin ich etwas verwirrt. Also das Erzeugen der Datenbank habe ich mit Database = master ausprobiert, das ändert an meinem Problem nichts. Wie meinst du das mit dem ConnectionString beim Erstellen der Tabelle, könntest du mir vielleicht ein kurzes Beispiel zum Löschen/Erzeugen der Datenbank und Erzeugen einer Tabelle geben?

Gruß Hades

06.05.2009 - 14:03 Uhr

Hmm ich habe Database = Statistiken mit in den ConnectionString geschrieben. Jetzt meckert er bei der Erstellung der Tabelle, dass die von der Anmeldung angeforderte Datenbank nicht geöffnet werden kann. Fehler bei der Anmeldung.

Könnte mir da nochmal jemand helfen?

06.05.2009 - 13:58 Uhr

Hmm also im ConnectionString einfach Database = Statistiken schreiben? Ich dachte das passiert wohl automatisch (wahrscheinlich aus reiner Naivität)...

06.05.2009 - 12:49 Uhr

verwendetes Datenbanksystem: SQL Server 2005

Hallo,

ich habe ein kleines Problem. Und zwar habe ich ein kleine Funktion geschrieben, die eine vorhandene Datenbank löscht, also samt Mediendateien.
Die Methode sieht in etwa so aus:


        private void drop_old_database_from_server()
        {
      
            String str;
            SqlConnection myConn = new SqlConnection("Server=.\\SQLExpress;Integrated security=SSPI");

            str = "DROP DATABASE Statistiken";

            SqlCommand myCommand = new SqlCommand(str, myConn);
            try
            {
                myConn.Open();
                myCommand.ExecuteNonQuery();
                MessageBox.Show("DataBase is Deleted Successfully", "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.ToString(), "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            {
                if (myConn.State == ConnectionState.Open)
                {
                    myConn.Close();
                }
            }
        }

Das klappt auch anscheinend, jedenfalls die Mediendateien sind danach gelöscht.
Wenn ich jetzt allerdings die Statistiken Datenbank wieder neu erzeuge klappt das auch bis zu dem Punkt an dem ich eine Tabelle erzeugen möchte. Die Tabelle hat denselben Namen der in der alten (gelöschten Datenbank) auch schon drin war.
Dann bekomme ich die Fehlermeldung das das Objekt (die besagte Tabelle) schon vorhanden ist. Also scheint die Datenbank ja nicht wirklich gedroppt worden zu sein.
Hier der Code mit dem ich die Datenbank neu erzeuge:


        private String DataBaseFullPath { get; set; }
        private String DataBaseLogFullPath { get; set; }

        public void CreateDB()
        {


            // Pfad zur Datenbank und zum Log setzen
            DataBaseFullPath = Application.StartupPath + "\\Statistics.mdf";
            DataBaseLogFullPath = Application.StartupPath + "\\DataBaseLog.ldf";

              {

 

                String str;
                SqlConnection myConn = new SqlConnection("Server=.\\SQLExpress;Integrated security=SSPI");

                str = 
                    "CREATE DATABASE Statistiken ON PRIMARY " +
                    "(NAME = MyDatabase_Data, " +
                    "FILENAME = '" + DataBaseFullPath + "'," +
                    "SIZE = 5MB, MAXSIZE = 200MB, FILEGROWTH = 10%) " +
                    "LOG ON (NAME = MyDatabase_Log, " +
                    "FILENAME = '" + DataBaseLogFullPath + "',"+ 
                    "SIZE = 1MB, " +
                    "MAXSIZE = 50MB, " +
                    "FILEGROWTH = 10%)";

                String tabelle_table1 =
                    "CREATE TABLE table1 (" +
                    "ID INT IDENTITY(1,1) NOT NULL, " +
                    "CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED ( ID ASC) " +
                    " ) ";
                     

                String create_full_database = str + tabelle_table1;

                SqlCommand myCommand = new SqlCommand(create_full_database, myConn);


                try
                {
                    myConn.Open();
                    myCommand.ExecuteNonQuery();
                    MessageBox.Show("Datenbank erfolgreich erstellt", "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString(), "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                finally
                {
                    if (myConn.State == ConnectionState.Open)
                    {
                        myConn.Close();
                    }
                }
                 
                 
            }

        }

Also das Objekt table1 ist in dem Fall schon vorhanden.
Ich hoffe jemand kann mir da weiterhelfen.

Gruß Hades

26.04.2009 - 11:54 Uhr

verwendetes Datenbanksystem: <Microsoft SQL Server 2005 / 2008>

Hallo,

ich möchte eine Datenbank für eine Anwendung erstellen, die ich mit mehreren Leuten mit Hilfe eines SVN repository programmiere.
Da sich zwar die Struktur der Datenbank mit allen Tabellen ect. gleicht, jedoch der Dateninhalt der Datenbank bei jedem unterschiedlich sein soll, stehe ich vor folgendem Problem: Wenn ich die Datenbank ins Projekt einfüge wird ja nicht nur die Struktur durch das Repository auf allen Clients verteilt sondern auch jede Datenveränderung. Die Struktur per Code zu erzeugen und dann auf jedem Client lokal eine Datenbank mit eben dieser Struktur anzulegen wäre ja auch etwas mühselig bei sehr großen Datenbanken.
Daher meine Frage, ob jemand eine gute Lösung für die Fragestellung hat. Am besten wäre es also wenn die Editor-Unterstützung für die Datenbanken nicht wegfällt und ich vielleicht eine Art Dummy ins Projekt einfügen kann welcher dann auf dem jeweiligen Client zur Erzeugung der lokalen Datenbank dient.

Gruß Hades

08.01.2009 - 17:53 Uhr

Vielen dank für eure Antworten.
Also ich werde Floskes Lösung definitiv einbauen, das scheint mir eine sehr vernünftige Lösung. Allerdings habe ich gerade gesehen das es eine CursorSetPos methode in der user32.dll gibt. Hat jemand Erfahrung mit der Methode? Macht die dasselbe oder is diese vielleicht etwas besser geeignet?

08.01.2009 - 17:44 Uhr

Hi,

also deine Lösung klingt nicht schlecht floske.
Warum ein Timer jetzt etwas groß anderes als ein sleep sein soll weiß ich allerdings nicht, könntest du mir vielleicht kurz erklären warum das mein Problem löst?

08.01.2009 - 17:32 Uhr

Hallo,

schonmal danke für die Antwort aber das ist nicht ganz das was ich mir als eine Lösung auf mein Problem vorgestellt habe. Man merkt dann doch recht deutlich das die Maus sich nicht wirklich Pixel für Pixel bewegt.

Hat vielleicht noch jemand eine Lösung für das problem? Also ich denke ich bräuchte eine Möglichkeit Windows eine Message zu schicken, die besagt, dass die Maus von Punkt A zu Punkt B bewegt werden soll, und zwar über alle Zwischenstationen...

Gruß Hades

08.01.2009 - 16:51 Uhr

Hallo,

ich bin dabei eine kleine Anwendung oder eher ein kleines Spielchen zu schreiben. Zwischendurch muss die Anwendung die Maus willkürlich quer über den Screen fahren lassen.
Das ganze habe ich per Cursor.Position = ...; realisiert. Die Maus bewegt sich auch so wie ich es mir vorstelle, jedoch passiert das ganze extrem langsam. Man könnte dabei einschlafen... Ich habe das ganze vor kurzem bei einem Kollegen ausprobiert der 2 CPU's in seinem Rechner hat, da lief es bedeutend schneller. Ich habe, nebenbei bemerkt, ein Thread.sleep(1) zwischen dem Versetzen der Mausposition um einen Pixel eingebaut, noch weniger geht ja schließlich nicht. Nehme ich das sleep(1) raus passiert alles so schnell, dass man es gar nicht mehr sieht.
Der Cursor scheint eine heiß umkämpfte Resource zu sein und ich befürchte ich werde den Kampf gegen Windows mit den Mitteln die ich benutze immer verlieren.
Daher meine Frage ob jemand eine andere Methode kennt die das gewünschte liefert oder ob ich das ganze beschleunigen kann.

Gruß Hades

15.12.2008 - 15:17 Uhr

Hallo,

ich hätte noch eine Frage, und zwar möchte ich ja das Polling verhindern. Ich habe mir überlegt das ich meine grafischen Threads nur dann starten muss wenn mein Zielfenster aktualisiert wurde. Gibt es eine Möglichkeit auf eine paint-message vom Betriebssystem zu warten und dann erst den Thread zu starten? Also ich habe mal mit dem spy++ geschaut und das Fenster liefert tatsächlich eine paint-meldung. Ich müsste jetzt eine Funktionalität haben, welche schläft und von außen geweckt wird sobald die paint-meldung kommt und somit das System nicht ausbremst.
Vielleicht hat da ja jemand eine Idee.

Gruß Hades

12.12.2008 - 20:11 Uhr

Hallo,

ich wollte mal kurz fragen ob jemand weiß wie man es erreichen kann, dass wenn man in einer Listbox scrollt, eine andere parallel mitgescrollt wird. Also konkret habe ich zwei Listboxes nebeneinander und ich möchte deren Inhalt gerne auf Gleicheit überprüfen. Um das komfortbler zu gestalten wäre es halt gut wenn beide immer die Elemente an derselben Position in der Listox anzeigen.
Vielleicht hat ja jemand auch mal dieses Problem gehabt und gelöst.

Gruß Hades

12.12.2008 - 18:00 Uhr

Hallo Herbivore,

schonmal danke für deine Antwort. Dann habe ich das mit den Threads doch wohl noch nicht so ganz verstanden. Es stimmt, dass meine Threads an sich immer durchrattern aber ich dachte das das BS den Threads die zeitscheibe so oft entzieht das alles einigermaßen normal weitergehen kann. Dem ist ja anscheinend nicht so. Wie könnte ich denn meine Threads mal etwas ausbremsen. Einfach an allen Ecken und Enden sleeps einzubauen und damit meine Threads einfach nur latenter machen kann es doch auch nicht sein. Gibt es da sonst noch Möglichkeiten oder muss ich meinen ganzen Code noch einmal durchgehen und genau gucken wann welcher Thread schlafen kann und somit vermeiden das sie immer alle einfach laufen.
Wenn sich das ganze so verhält kann ich ja eigentlich nie auch nur einen Thread permanent arbeiten lassen...?
Mit der Synchronisation muss ich dann nochmal schauen, obwohl ich an sich sichergestellt habe das keine Methode mit falschen oder noch nicht ganz vollständigen Daten aus anderen Threads weiterarbeitet. Es ist wie gesagt etwas verwirrend im Moment.

Ich bin für jeden weiteren Hinweis dankbar.

Gruß Hades

12.12.2008 - 17:33 Uhr

Hallo,

ich habe eine kleine Anwendung geschrieben und erzeuge innerhalb des Prozesses 3 Threads. Ein Thread updated eigentlich immer nur eine Form und aktualisiert Textboxen. Das aktualisieren wird durch einen Timer alle 1000ms ausgeführt. Der zweite Thread benutzt die GDI methode getpixel und überprüft für mich einen Bereich auf dem Screen um mich zu informieren ob eine bestimmte Aktion abgeschlossen ist. Ein dritter Thread führt hauptsächlich String methoden aus, also es werden Strings zusammengebaut und deren Inahlt wird durchsucht.
Das Problem was ich jetzt habe ist, dass mein gesamtes System total ausgebremst wird von den drei Threads und ich weiß nicht genau warum. Also wenn ich z.B. auf der Form arbeiten möchte oder sie einfach nur verziehen möchte, dann geht das ganze nur mit sehr viel Verzögerung. Außerdem liefern einige Methoden ab und zu völligen Quatsch zurück. Wenn ich sie einzeln aufrufe bei demselben Szenario liefern sie das gewünschte. Ich habe sowieso bemerkt, dass je mehr Threads ich starte und je latenter das System reagiert, desto mehr Fehler bekomme ich.

Vielleicht kann mir ja jemand ein paar Tipps geben woran so etwas liegen könnte, ich habe mir schon einiges zu Threads durchgelesen und z.B. sichergestellt das kritische Pfade durch ein lock abgesichert werden. Dennoch verstehe ich die hohe Systemauslastung und die sehr unverständlichen Fehler nicht.

Gruß Hades

13.11.2008 - 01:48 Uhr

Hi,

also ich habs auch direkt mal ausprobiert und bei mir scheint alles ok zu sein auch ohne Graphics.Clear.

Ich benutze Vista Business 32 bit, allerdings habe ich das ganze Aero-Gedöns deaktiviert, vielleicht hängt es ja damit zusammen.

Gruß Hades

So siehts bei mir aus:

12.11.2008 - 18:51 Uhr

Hmm ok aber wie hol ich mir die X- und Y-Koordinte aus dem lparam?

Und unterscheiden sich die Werte denn wirklich von Cursor.Position?

Bin für jede Hilfe dankbar.

Gruß Hades

12.11.2008 - 02:02 Uhr

Hallo,

ich benutze einen MausHook um globale Mausklicks abzufangen und lese die Cursor.Position aus wenn sich die maus bewegt und wenn die linke Maustaste nach unten gedrückt wird. Nur komischerweise ändert sich beim Runterdrücken die Cursorposition um einen Pixel.
Ich möchte eine Art Bildschirmlupe machen.
Weiß jemand warum sich die Position ändert und wie ich das ganze umgehe? Ich muss die Lupe auch anzeigen wenn runtergedrückt wird, falls man die Maus gar nicht bewegt und direkt klickt um ein Bild aufzunehmen an der Position.
Hier ein wenig Code:


            if (nCode >= 0 && MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam)
            {
                activateMagnifyingGlass(Cursor.Position.X, Cursor.Position.Y);
            }

            if (nCode >= 0 &&  MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
            {
               activateMagnifyingGlass(Cursor.Position.X, Cursor.Position.Y);
            }

Beim Runterdrücken wird immer die Position wohl so wie ichs beobachtet habe immer in die Richtung verschoben, in die man die Maus zuletzt bewegt hat...
Manchmal wird die Position aber auch nicht geändert.

Ich weiß mir da nicht wirklich zu helfen im Moment.

Gruß Hades

30.10.2008 - 02:13 Uhr

So, also ich habe das ganze Problem gerade mit Benji noch lösen können.

Der Thread kann somit zu den Akten 😉

Gruß Hades

29.10.2008 - 22:19 Uhr

Hi Benji,

in der Tat habe ich das Problem, dass mein Prozess keinen String annimmt der ein Whitespace, also ein Blank enthält. Hmm das problem scheint ja dann doch häufiger aufzutreten...
Über die tastatureingabe oder auch per SendMessage klappt es allerdings tadelos, da wird jeder String einwandfrei angenommen und verarbeitet.

Ich hoffe jemand weiß da Rat...

Gruß Hades

29.10.2008 - 21:03 Uhr

Hallo,

weiß jemand ob und wie es möglich ist es so einzurichten, dass ein aus meinem Projekt gestarteter Konsolenprozess den Input noch über tastatur annimmt obwohl ich den Output umleite?
Also ich habe es im Code so, dass shellexecute auf flase steht, redirectstandardoutput auf true und redirectstandardinput auf false.
Nur leider verhält es sich so, dass ich trotzdem keine Eingaben mehr über die tastatur tätigen kann. Selbst mit einer SendMessage-Funktion aus der User32 nimmt der prozess nichts an.

Gruß Hades

28.10.2008 - 19:22 Uhr

So, danke nochmal für eure schnellen Antworten, mittlerweile klappt alles bestens.

Gruß Hades

28.10.2008 - 18:58 Uhr

Hi, also ich habe folgendes probiert:


            my_process.Start();
            my_process.StartInfo.RedirectStandardOutput = true;
            System.IO.StreamReader my_reader = my_process.StandardOutput;
            String my_inhalt = my_reader.ReadToEnd();

Der Prozess startet ordnungsgemäß aber ich bekomme eine Exception die besagt: StandardOut wurde nicht umgeleitet, oder der Prozess wurde noch nicht gestartet.

Der Prozess ist allerdings nicht null wenn ich beim Debuggen nachsehe, müsste also doch gestartet sein?

Hast du einen Rat Herbivore?

Gruß Hades

28.10.2008 - 18:14 Uhr

Hi,
Ich suche schon seit geraumer Zeit ne Möglichkeit Text aus nem Konsolenfenster zu bekommen, um ihn als String zu speichern und damit dann weiter zu arbeiten.
Also die ganz normale Konsole, die man eben mit cmd aufrufen kann.
Ich hoffe, dass mir jemand von euch weiterhelfen kann. 😉
Gruß, Hades.

22.10.2008 - 20:04 Uhr

Na ja, was heißt sträuben, ich hab schon angefangen es mit Direct3D umzusetzen aber das mindert nicht mein Interesse die Ursache herauszufinden und wenn möglich das Problem zu lösen. Manchmal will man halt einfach etwas wissen 😉

22.10.2008 - 19:57 Uhr

Es ist absolut reproduzierbar und die Daten sind 100% korrekt. Ich habe die Daten auf einen Rechner mit Windows XP kopiert und dort wird das komplette Bild 100% korrekt gezeichnet, es ist also ziemlich sicher ein Vista-Problem. Ich habe es auch noch auf einem Laptop mit Vista getestet, da kommt exakt dasselbe Problem.

Hat keiner eine Idee?

22.10.2008 - 18:36 Uhr

Na ja, das könnte ich vielleicht auch und ich könnte es natürlich auch mit Direct3D machen um es zu beschleunigen oder dergleichen aber ich habe mich nunmal für SetPixel entschieden und das sollte ja theoretisch auch problemlos funktionieren.
Desweiteren liegt es nicht in meiner Absicht bei jedem Problem einfach eine Alternative vorzuziehen, da es doch auch ganz schön wäre ein Problem zu verstehen und es zu lösen.

Zum eigentlichen problem: Ich habe das problem etwas "eingegrenzt". Ich habe ein int[][] mit der Größe meiner Desktopauflösung (1280x1024) serialisiert und habe versucht das mittels SetPixel auf den Desktop zeichnen zu lassen. Das Resultat ist, dass jedesmal 2 große "Löcher" entstehen, und zwar genau zwischen den Pixeln 256 - 512 und 768 - 1024. Die "Löcher" oder besser gesagt die nicht gezeichneten Streifen gehen von oben bis unten, sind also durchgehend.

Ich hoffe dieses seltsame Verhalten kann mir jemand erklären und/oder hat einen Lösungsvorschlag für mich (außer: ersetze SetPixel durch xxx).

Gruß -Hades-

22.10.2008 - 11:53 Uhr

Hat denn wirklich niemand eine Idee?

21.10.2008 - 21:37 Uhr

Hallo,

ich versuche mittels folgender Funktion ein zuvor aufgenommenes Bild (mittels gdi32.getpixel) auf den Desktop zu zeichnen. Das zuvr aufgenommene Bild speicher ich als int[][]. Das Problem an der ganzen Sache ist, dass das Bild manchmal komplett und korrekt gezeichnet wird, manchmal stimmt wohl die Höhe aber es ist nur halb so breit (also die Hälfte ist einfach abgeschnitten und wird nicht gezeichnet) und manchmal wird einfach gar nichts gezeichnet. Die Methode wird jedesmal komplett durchlaufen, das habe ich mittels Haltepunkte getestet.

Hier die Funktion:


        public void putFieldToScreen(int put_left, int put_top)
        {
            if (hDC == (System.IntPtr)0)
            {
                hDC = User32.GetWindowDC(User32.GetDesktopWindow());
            }
            for (int j = 0; j < height; j++)
            {
                for (int i = 0; i < width; i++)
                {
                    GDI32.SetPixel(hDC, put_left + i, put_top + j, (uint)pixeldata[j][i]);
                }
            }
            return;
        }

Weiß jemand ob das an Vista liegt oder doch am Code? Weiß mir langsam nicht mehr zu helfen.

Edit: Das zuvor aufgenommene Bild habe ich serialisiert und ich deserialisiere es beim Start wieder, an den Daten des Bildes kann sich also nichts ändern.

Gruß -Hades-

12.09.2008 - 15:36 Uhr

Ich denke ich werde jetzt mit einem Kompromiss leben müssen.
Habe jetzt folgendes gemacht, mit Hilf der showwindow Funktion der user32 :


while (FindWindow("ConsoleWindowClass", null) == IntPtr.Zero)
{
       Thread.Sleep(10);
}
ShowWindow(meinprocess.MainWindowHandle, (uint)WindowShowStyle.Hide);

Das Fenster blitzt ganz kurz auf und ist dann unsichtbar bis ich es wiederhole.
Ich habe mit den Millisekunden etwas getestet. Bei 1 Millisekunde ist es schon öfters vorgekommen das das Fenster sichtbar blieb, bei 5 war es sehr selten und bei 10 ist es keinmal (aus 50 Testläufen) sichtbar geblieben.

Sollte dennoch jemand eine saubere Lösung für mich haben immer her damit 🙂

Gruß -Hades-

12.09.2008 - 15:08 Uhr

Hi Th69,

erstmal danke für die Antwort. Habs gerade getestet. Leider ist WaitForInputIdle nur für Programme zulässig die eine grafische Oberfläche haben. Das Programm was ich da starte hat leider nur eine Console...
Da bekomme ich dann eine Exception.

11.09.2008 - 18:05 Uhr

Also ich nehme an es hat wirklich niemand eine Lösung für das Problem...?

10.09.2008 - 16:06 Uhr

Ja über das MainWindowHandle Property vom Prozess...

10.09.2008 - 15:23 Uhr

Ach Quatsch, moment mal, jetzt bin ich zu früh in Euphorie verfallen 😁
Genau das abe ich ja schon getan. Mithilfe von pinvoke habe ich ja immer das MainwindowHandle versteckt und wieder angezeigt. Das löst leider nicht das Problem das ich nicht genau abfangen kann wann der Prozess soweit ist.

10.09.2008 - 15:21 Uhr

Aha, dicken Dank im voraus, werd ich direkt mal testen!

Ich meld mich was dabei rauskommt.

10.09.2008 - 15:11 Uhr

Also zunächst habe ich es wie gesagt mit den System.Diagnostics.Process-Mitteln versucht, also prozess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

Das klappt nur kann ichs nicht wieder erscheinen lassen (auch nicht mit der Windows API).

Und als zweites halt mit der ShowWindow aus der User32.dll

Ich glaube ich weiß nicht genau worauf du hinaus willst.

@GMLOD: Der Artikel hat mir leider nicht weitergeholfen, da es sich um ein externes Programm handelt welches ich verstecken möchte.

10.09.2008 - 14:33 Uhr
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

Die habe ich benutzt.

10.09.2008 - 14:18 Uhr

Hmm ja habe direkt bei pinvoke geguckt. Wie gesagt ist da die Lösung es mit der showwindow Funktion der User32.dll zu machen. Das funktioniert ja auch, ich kann das Fenster auf Befehl verstecken und wieder sichtbar machen usw., nur muss ich dann wenn der Prozess zum ersten mal gestartet wird per Thred.sleep lange genug warten bis der Prozess soweit ist, ansonsten läuft der Befehl ins leere und der Befehl zum z.B. verstecken des Prozesses schlägt fehl. Und da es sich so verhält, dass manchmal 10 Millisekunden ausreichen und der PC manchmal noch soviel im Hintergrund macht das 200 Millisekunden nicht ausreichen, ist es schon eine eher naive Lösung.

Ich könnte naürlich einfach 5 Sekunden jedesmal warten aber dann habe ich ja das, was ich erreichen wollte verloren. Ich möchte ja das das Fenster von Anfang an unsichtbar ist. So wäre es dann immer für eine unbestimmte Zeitspanne sichtbar und wird dann unsichtbar.