Schrift
[thread]11067[/thread]

Tastaturereignis anzeigen



<< >> 7 Einträge, 1 Seite
rommi
 2007-12-27 23:16
#104156 #104156
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo Perlfans,

wer kann mir ein bisschen weiterhelfen. Ich möchte den Mauszeiger auf eine beliebige Stelle auf dem Bildschirm stellen und dann auf der Tastatur Enter drücken. In einem Fenster soll dann die aktuelle Mausposition (Bildschirmkoordinate) erscheinen.

Die Koordiante, wo sich die Maus gerade befindet, ermittle ich momentan mit GetCursorPos() und gebe die Koordniate dann in der Dos-Box aus. Aber wie gesagt, möchte ich das Ergebnis über TK in einem Widget, am Besten Canvas oder einem zusätzlichen Fenster zum Hauptfenster, anzeigen lassen.

Vielleicht soll ich mal den ganzen Vorgang erklären. Ich möchte von meinem Bildschirm einen aktuellen Screenshot machen aber nicht vom Ganzen Bildschirm sondern nur von einem zuvor durch die Maus markierten Bereich.

1. Stelle Mauszeiger auf die linke obere Ecke des gewünschten Bildschirmbereichs
2. Drücke die Entertaste damit die Koordinate in einer Variablen gespeichert und in einem Fenster angezeigt wird
3. Stelle Mauszeiger auf die rechte unter Ecke des gewünschten Bildschirmbereichs
4. Drücke die Entertaste damit die Koordinate in einer Variablen gespeichert und in einem Fenster angezeigt wird
5. Erstelle jetzt einen Screenshot über den gewählten Bereich und speicher es als Bild ab.
6. Gib das abgespeicherte Bild in einem Fenster aus


Viele Grüsse und vorab schon alles Gute für neue Jahr
rommi
ptk
 2007-12-28 01:33
#104158 #104158
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Bedeutet "beliebige Stelle auf dem Bildschirm" insbesondere "außerhalb des Tk-Fensters"? Ich vermute, dass du in diesem Fall mit einem globalen Grab arbeiten musst. Genau weiß ich es aber auch nicht...
rommi
 2007-12-28 02:41
#104159 #104159
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Jo, irgendeinen Bereich des Bildschirms ausserhalb des TK-Fensters, sonst könnte es man wohl mit bind lösen. Was meinst du mit globalen Grab?

Gruss
rommi
rommi
 2007-12-28 02:50
#104160 #104160
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo nochmal,

noch praktischer wäre es mit der Maus gleich einen Rahmen um den gewünschten Bereich ziehen zu können und den Bereich dann als Bild abzuspeichern. Das wäre natürlich eine wesentlich feinere Methode als die Maus zu positionieren dann Enter drücken und das ganze nochmal wiederholen. Aber ich weiss nicht ob es in Perl irgendein Modul für so ne individuelle Sache gibt??

Gruss
rommi
#Kein Kommentar
 2007-12-28 12:14
#104186 #104186
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
vielleicht CPAN:Win32::GUI?
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
ptk
 2007-12-28 12:38
#104190 #104190
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Mit einem globalen Grab erhält die Anwendung die Kontrolle über den gesamten Desktop. Aber man muss auch vorsichtig sein, dass man sich damit nicht aussperrt.

Beispiel, einfach die Maus außerhalb des Tk-Fensters bewegen:
Code: (dl )
1
2
3
4
5
6
7
use Tk;
$top = new MainWindow;
$top->update;
$top->grabGlobal;
$top->after(3000, sub { $top->destroy });
$top->bind("<Motion>" => sub { warn join ",", $top->pointerxy });
MainLoop;
Gast Gast
 2007-12-29 13:00
#104242 #104242
Da kann ich nur Win32::GUI ( insbesondere Win32::GUI::DC ) empfehlen.
Den Desktop kannste damit auf jedenfall bemalen, den Rahmen zu zeichnen sollte also kein Problem sein, und auch Bilddaten kann man damit auslesen, nur wie man an die Mauskoordinaten ran kommt, kann ich dir nich sagen, aber wenn du sowieso Tk benutzt, kannst du das auch mit Tk regeln.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
# Modul einbinden
use Win32::GUI;

# Bildschirm holen
my $screen = Win32::GUI::DC -> new( "SCREEN" );

# Bilddaten auslesen ( da gibts bestimmt schon ne Funktion GetRect() oder ähnlich, habs aber gerade nur so im Kopf )
my $color = $screen -> GetPixel( $x, $y );

# Desktop bemalen ( bestimmt kannste auch direkt ein Rechteck malen, hab nur gerade nur diese Funktion im Kopf )
$screen -> SetPixel( $x, $y, $color );

$color ist im ersten Fall ein Integer, den du einfach mit sprintf( '%x' ) umwandeln kannst in eine hexadezimale Zahl, mit RGB Werten.
Im 2. Fall kann es eine hexadezimale Zahl sein, falls '#' voran steht.
Und wie gesagt, die Koordinaten musst du dir so holen, wie ptk es geschreiben hat.

MfG Horst
<< >> 7 Einträge, 1 Seite



View all threads created 2007-12-27 23:16.