Laden...

Screenshot-Anwendung mit weiterem Monitor links liefert falsche Koordinaten und MouseEvents

Erstellt von OliverSte vor 3 Jahren Letzter Beitrag vor 3 Jahren 895 Views
O
OliverSte Themenstarter:in
11 Beiträge seit 2019
vor 3 Jahren
Screenshot-Anwendung mit weiterem Monitor links liefert falsche Koordinaten und MouseEvents

Moin!

Ich habe hier eine kleine Screenshot Anwendung, die folgendermaßen arbeitet:
Es wird ein halbtransparentes Fenster erzeugt. Das schiebt der Anwender über den Bereich, wovon er einen Screenshot erstellen möchte. Dann zieht er in dem Fenster ein Rechteck auf. Davon wird dann letztendlich der Screenshot erstellt. Funktioniert prima.

Nun habe ich einen Zweitmonitor LINKS neben dem Hauptmonitor.
Dieser hat Entweder eine höhere Auflösung, also der Ursprung links oben ist im negativen Bereich, bezogen auf den Hauptmonitor. Die window.Location Koordinaten sind negativ.
Oder der Zweitmonitor ist in der Systemsteuerung nach OBEN versetzt, das ist mal egal.

Ziehe ich nun mein Screenshotfenster auf den Zweitmonitor nach oben, dann werden Mouseevents nicht mehr korrekt verarbeitet. Genau in dem Bereich, der über 0 des Hauptmonitors liegt, ändert sich der Mauszeiger zu "Größenänderung" und ich kann mit Mausklick nur noch die rechte untere Ecke des Fensters ziehen. Im unteren Bereich >0 ist alles schick, der Mauszeiger ist der gewöhnliche Pfeil und es werden sowohl MouseMove, als auch MouseClick Events gefeuert.

Die Events OnMouseMove und andere sind so definiert:


protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            mousePoint = e.Location;
            this.Text = $"Fenster: {Location.X} x {Location.Y} -> {Width} x {Height}  Bereich: {RectangleToScreen(ClientRectangle).X} x {RectangleToScreen(ClientRectangle).Y} -> {RectangleToScreen(ClientRectangle).Width} x {RectangleToScreen(ClientRectangle).Height} Maus: {mousePoint}";
                        
            Invalidate();
        }

Das Problem tritt nicht auf, wenn der Zweimonitor RECHTS vom Hauptmonitor steht, obwohl das für die Y Koordinaten irrelevant ist. Es tritt auch nicht auf, wenn der Zweitmonitor nach UNTEN versetzt neben dem ersten platziert wird

Da z.B. VisualStudio keine Probleme mit Auflösung und versetzten Monitoren hat, gehe ich davon aus, dass ich irgendwas falsch mache. Ich kann nur nicht erkennen, was das sein soll. Den Mauszeiger ändere ich ja nicht 😉
Danke für Hilfe.

Viele Grüße Oliver

O
OliverSte Themenstarter:in
11 Beiträge seit 2019
vor 3 Jahren
nur bei ShowDialog()

Nachtrag:
Der Fehler tritt nur auf, wenn man das Fenster als Dialog öffnet.

3.825 Beiträge seit 2006
vor 3 Jahren

Du schreibst ja schon dass es nur bei Koordinaten kleiner 0 auftritt.

Die musst Du sicher extra abfangen.

Es ist normal das die Koordinaten negativ sind wenn der Sekundäre Monitor über oder links vom primären Monitor ist.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

5.657 Beiträge seit 2006
vor 3 Jahren

Genau in dem Bereich, der über 0 des Hauptmonitors liegt, ändert sich der Mauszeiger zu "Größenänderung" und ich kann mit Mausklick nur noch die rechte untere Ecke des Fensters ziehen.

Was hat dieses Problem denn mit dem Code zu tun, den du gepostet hast?

Gibt es dieses Verhalten auch auf einem anderen Rechner? Ist das nur bei deinem Programm so, oder bei allen Fenstern? Falls ja, liegt es an deinem Code, aber sicher nicht an dem, den du gepostet hast.

Weeks of programming can save you hours of planning

O
OliverSte Themenstarter:in
11 Beiträge seit 2019
vor 3 Jahren

Moin,

ganz lieb von Euch, dass Ihr mir helfen wollt. Danke dafür.
Ob der Code etwas mit dem Problem zu tun hat, kann ich nicht beurteilen. Sonst hätte ich das Problem möglicherweise gar nicht. Deshalb habe ich ihn gepostet.

Der Mauszeiger ändert sich beim Schieben (wie in Windows üblich) ohne "mein Zutun", Ich meine damit, außer der Events manipuliert mein Code in der Richtung nichts. Auch deshalb habe ich ihn gepostet. Events und überschriebene Basislassen sind nicht mein Steckenpferd, ok?

Nun zu den anderen Hinweisen. Die Koordinaten werden negativ, klar.
Ich kann da nichts abfangen, denn es wird keins "meiner" Events gefeuert, wenn der Mauszeiger sich ändert. In dem Moment, wenn der Cursor die Form "Größenänderung" annimmt, reagiert mein OnMouseDown Event nicht!

Bewege ich die Maus im unteren Bereich (>0) funktioniert alles. Ich kann auch ein Rechteck in den oberen Bereich (ins Negative) aufziehen, klappt alles, auch die Umrechnung in absolute Bildschirmkoordinaten. Also soweit alles gut, da bisschen Mathematik dürft Ihr mir also zutrauen.

Ich habe das Verhalten in verschiedenen Konfigurationen auf mehreren Rechnern untersucht. Es ist immer gleich, also wie beschrieben. Ich habe ja auch mittlerweile die Ursache gefunden und sogar noch vor Euren Antworten und Rückfragen gepostet 😉

Öffne ich ein beliebiges Fenster im Dialog-Modus, tritt der Fehler auf. Öffne ich das normal, tritt der Fehler nicht auf. Ist dann alles wesentlich komplizierter zu programmieren, wegen Variablen, Zuständen u.s.w. Geht aber, hab ich jetzt auch so gemacht, weil ich mit dem Programm weiterkommen muss.

Schön ist es aber nicht und ich habe die Hoffnung, dass es einen einfacheren Workaround gibt, weil ich mein Fensterchen lieber als Dialog öffnen würde.

Danke nochmal für Eure Aufmerksamkeit.

Viele Grüße Oliver

D
261 Beiträge seit 2015
vor 3 Jahren

Das dürfte dieses Problem hier sein:
https://github.com/dotnet/winforms/issues/1504
Wird/wurde in .NET 5 behoben.

O
OliverSte Themenstarter:in
11 Beiträge seit 2019
vor 3 Jahren

@dannoe

Danke sehr, das sieht genau nach meinem Problem aus.
Ist der RC für eine Produktivumgebung bereits zu gebrauchen, was meinst du? MS "erlaubt" es zumindest.
Müssen meine Anwender sich dann v5.0 auch erst installieren? Mit Distribution kenne ich mich auch nicht so gut aus 😉

Viele Grüße Oliver

16.807 Beiträge seit 2008
vor 3 Jahren

Ist der RC für eine Produktivumgebung bereits zu gebrauchen, was meinst du? MS "erlaubt" es

Das kann ja niemand beurteilen ausser Du.
Aber in genau einem Monat wird .NET 5 ja released.

Müssen meine Anwender sich dann v5.0 auch erst installieren? Mit Distribution kenne ich mich auch nicht so gut aus 😉

Natürlich; ohne Runtime kann eine Anwendung nicht laufen.
Also entweder als Installation vorgeben oder Du lieferst die Runtime (aka self contained) mit aus.

O
OliverSte Themenstarter:in
11 Beiträge seit 2019
vor 3 Jahren

@Abt
Danke sehr. Ich kann die Frage natürlich nicht selbst beantworten, weil ich noch nicht ein einziges Programm für v5 kompiliert habe. Wie soll ich da beurteilen, ob das was taugt?
Aber wahrscheinlich ist ein RC schon für eine Produktivumgebung zu gebrauchen, zumal schon in vier Wochen das Release erscheinen soll.

Da das aber natürlich nicht auf jedem Zielsystem vorhanden ist, wie geht das denn mit "self contained"? Ist das ein Switch in den Projekteigenschaften?
Danke.

Viele Grüße Oliver

2.078 Beiträge seit 2012
vor 3 Jahren

.NET 5 ist der direkte Nachfolger von .NET Core 3.1

Und "self contained" meint, dass das Programm seine eigene Runtime mit bringt.
Ist dann natürlich größer

16.807 Beiträge seit 2008
vor 3 Jahren

wie geht das denn mit "self contained"? Ist das ein Switch in den Projekteigenschaften?

Wenn man etwas nicht weiß, dann ist das überhaupt nicht schlimm.
Dafür gibt es schließlich Dokumentationen; man muss sie einfach nur lesen 😃

.NET Core application publishing self contained

O
OliverSte Themenstarter:in
11 Beiträge seit 2019
vor 3 Jahren

@Abt

Danke, da steht ja ne Menge tolles Zeug.
Also kein Switch in den Projekteigenschaften, sondern irgendwas auf Kommandozeile.
Ich versuche es mal:


C:\Users\olive>dotnet publish -r win-x64
Der Befehl "dotnet" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

Klappt zu meiner Überraschung nicht. Was mache ich denn falsch?
Danke.

Viele Grüße Oliver

309 Beiträge seit 2020
vor 3 Jahren

Klappt zu meiner Überraschung nicht. Was mache ich denn falsch?

Übersicht über die .NET Core-CLI

Gleich im ersten Absatz, Installieren von .NET Core SDK. Kannst du aber auch mit dem VS Installer.