Screenshot eines Bildschirmausschnitts erzeugen
-
Hi,
ich bastele momentan an einer kleinen Applikation zur Erstellung und Speicherung von Screenshots. Unter anderem möchte ich die Erstellung eines Screenshots von einem Bildschirmausschnitt ermöglichen und habe mir folgende, prinzipielle Vorgehensweise vorgestellt:
1. Fenster der Applikation verstecken.
2. "Aufziehen" eines Rechtecks über dem Bereich, von dem der Sreenshot erstellt werden soll.
3. Speichern des Screenshots.
4. Fenster der Applikation wieder anzeigen.Würde ich mich auf das Fenster meiner Applikation beschränken, wäre die Umsetzung kein Problem. Schwierigkeiten habe ich damit, sämtliche Mausnachrichten an meine Applikation umzuleiten und somit in einem Bereich zeichnen zu können, der nicht zu meiner Anwendung gehört.
Ich möchte keinen kompletten Lösungsvorschlag bekommen und weiß natürlich auch, dass entsprechende Freeware-Tools überall zur Verfügung stehen.
Trotzdem würde ich mich über ein paar Anregungen freuen, wo ich mit der Suche nach geeigneten Methoden beginnen soll. Bieten die MFC hierfür Brauchbares an, oder bin ich bei WinAPI besser aufgehoben?
Bei meiner bisherigen Suche verliere ich mich ein wenig in den Tiefen des MSDN: SetCapture(), SetActiveWindow(), etc...
-
SetCapture ist alles was Du brauchst. Solange die Maustaste unten ist bekommst Du alle entsprechenden Nachrichten. Schau Dir das Spy++ Verfahren an.
Du könntest auch ein transparentes Fenster (ohne Caption und Rahmen) über alle anderen Fenster legen und damit die Mausnachrichten abfangen.
Hooks (für die Maus in diesem Fall) sind eine weitere Möglichekit.
Mit DrawFocusRect kanst Du auch einfach nicht destruktiv Zeichnen und das Rectangle wieder verschwinden lassen.
-
Zunächst einmal danke für die Hinweise!
Martin Richter schrieb:
SetCapture ist alles was Du brauchst. Solange die Maustaste unten ist bekommst Du alle entsprechenden Nachrichten.
Das Problem mit SetCapture ist leider, dass ich eben nur dann alle Nachrichten bekomme, wenn die Maustaste unten ist. Wenn ich das richtig verstehe, muss ich also die Maustaste innerhalb des Fensters meiner Anwendung drücken und bekomme dann alle Nachrichten, auch wenn ich die Maus aus meine Fenster herausbewege. Was ich eigentlich bräuchte, wäre eine Methode, die bereits die Nachricht des Drückens der Maustaste an meine Anwendung weiterleitet, egal wo dieser Tastendruck erfolgt.
MSDN schrieb:
SetCapture captures mouse input either when the mouse is over the capturing window, or when the mouse button was pressed while the mouse was over the capturing window and the button is still down. [...] If the mouse cursor is over a window created by another thread, the system will direct mouse input to the specified window only if a mouse button is down.
Martin Richter schrieb:
Du könntest auch ein transparentes Fenster (ohne Caption und Rahmen) über alle anderen Fenster legen und damit die Mausnachrichten abfangen.
Das ist ein interessanter Ansatz! Kleiner Nachteil: ich könnte die Taskleiste nicht in meine Screenshots einbeziehen.
Martin Richter schrieb:
Hooks (für die Maus in diesem Fall) sind eine weitere Möglichekit.
Damit habe ich mich bisher noch gar nicht befasst. Damit sollte ich mich wohl auf alle Fälle einmal beschäftigen...
-
Schau Dir mal den Spy an. Er minimiert das eigene Fenster wenn man die Maus klickt und man kann dann entsprechend ein Fenster auswählen.
Wenn Du das Fenster groß genug macht und als top most markierst müsste es auch über der Taskleiste liegen.