Hi
<b>Norbert Spörl, stellte mir folgende Frage:</b>
Wenn ich vom Desktop einen Schnappschuß mache, wird ja der Mauskursor nicht mit abgebildet. Ich muß also Position und Handle des Mauskursors ermitteln, um die Mauskursor-Bitmap nachträglich in die Schnappschuß-Bitmap einzusetzen. Position des Mauskursors ist kein Problem, aber der Handle liefert mir immer nur den Standardkursor zurück. Ist also die Maus beim Schnappschuß über einem Link, so wird der Standardkursor ja in eine Hand gewandelt.
<b>Die lösung:</b>
Setze auf TForm1 ein Image1: TImage und einen Timer1: TTimer. Nachfolgend der Code für das OnTimer Event.
<pre>
procedure TForm1.Timer1Timer(Sender: TObject);
var
Wnd: hWnd;
ThreadID, ProcessID: DWord;
Cursor: HCursor;
Icon: TIcon;
Pos: TPoint;
Info: TIconInfo;
begin
// ermittle globale Cursorposition<br>
GetCursorPos(Pos);<br>
// ermittle das darunterliegende Fenster
// es ist egal ob das fenster auch den Focus besitzt
// Hauptsache es gehört zum gleichen Thread/Process wie
// das focusierte Fenster<br>
Wnd := WindowFromPoint(Pos);<br>
// ist es denn auch ein gültiges Fensterhandle ?
if IsWindow(Wnd) then
begin<br>
// ermittle nun ProcessID und ThreadID
ThreadID := GetWindowThreadProcessID(Wnd, @ProcessID);<br>
// falls es NICHT zu meiner Anwendung gehört, hänge
// diesen Thread an den Thread des gefundenen Fensters<br>
if (ProcessID <> GetCurrentProcessID) and
AttachThreadInput(GetCurrentThreadID, ThreadID, true) then
try<br>
// hole Cursor
Cursor := GetCursor;<br>
finally
// and back now
AttachThreadInput(GetCurrentThreadID, ThreadID, False);<br>
end else
// wird wohl dem eigenen Process gehören
Cursor := GetCursor;<br>
// dupliziere nun den Cursor
// es gibt zwar laut Windows-API Hilfe eine CopyCursor()
// Funktion, leider aber nicht von delphi importiert
// also machen wir's selber
// Diese Duplication ist SEHR WICHTIG, falls nicht
// dupliziert wird und der Cursor zerstört wird ent-
// stehen sehr unsaubere Effekte<br>
if GetIconInfo(Cursor, Info) then
try
Info.fIcon := False;
Cursor := CreateIconIndirect(Info);
finally
DeleteObject(Info.hbmMask);
DeleteObject(Info.hbmColor);
end;<br>
// nun ist Cursor ein reguläres Object unseres Processes
// weise es einem Icon zu, ist das gleiche, das Icon
// zerstört dann schon selber das Handle<br>
Icon := TIcon.Create;
try
Icon.Handle := Cursor;
Image.Picture.Assign(Icon);
finally
Icon.Free;
end;
end;
end;
</pre>
Gruß Hagen
<b>Norbert Spörl, stellte mir folgende Frage:</b>
Wenn ich vom Desktop einen Schnappschuß mache, wird ja der Mauskursor nicht mit abgebildet. Ich muß also Position und Handle des Mauskursors ermitteln, um die Mauskursor-Bitmap nachträglich in die Schnappschuß-Bitmap einzusetzen. Position des Mauskursors ist kein Problem, aber der Handle liefert mir immer nur den Standardkursor zurück. Ist also die Maus beim Schnappschuß über einem Link, so wird der Standardkursor ja in eine Hand gewandelt.
<b>Die lösung:</b>
Setze auf TForm1 ein Image1: TImage und einen Timer1: TTimer. Nachfolgend der Code für das OnTimer Event.
<pre>
procedure TForm1.Timer1Timer(Sender: TObject);
var
Wnd: hWnd;
ThreadID, ProcessID: DWord;
Cursor: HCursor;
Icon: TIcon;
Pos: TPoint;
Info: TIconInfo;
begin
// ermittle globale Cursorposition<br>
GetCursorPos(Pos);<br>
// ermittle das darunterliegende Fenster
// es ist egal ob das fenster auch den Focus besitzt
// Hauptsache es gehört zum gleichen Thread/Process wie
// das focusierte Fenster<br>
Wnd := WindowFromPoint(Pos);<br>
// ist es denn auch ein gültiges Fensterhandle ?
if IsWindow(Wnd) then
begin<br>
// ermittle nun ProcessID und ThreadID
ThreadID := GetWindowThreadProcessID(Wnd, @ProcessID);<br>
// falls es NICHT zu meiner Anwendung gehört, hänge
// diesen Thread an den Thread des gefundenen Fensters<br>
if (ProcessID <> GetCurrentProcessID) and
AttachThreadInput(GetCurrentThreadID, ThreadID, true) then
try<br>
// hole Cursor
Cursor := GetCursor;<br>
finally
// and back now
AttachThreadInput(GetCurrentThreadID, ThreadID, False);<br>
end else
// wird wohl dem eigenen Process gehören
Cursor := GetCursor;<br>
// dupliziere nun den Cursor
// es gibt zwar laut Windows-API Hilfe eine CopyCursor()
// Funktion, leider aber nicht von delphi importiert
// also machen wir's selber
// Diese Duplication ist SEHR WICHTIG, falls nicht
// dupliziert wird und der Cursor zerstört wird ent-
// stehen sehr unsaubere Effekte<br>
if GetIconInfo(Cursor, Info) then
try
Info.fIcon := False;
Cursor := CreateIconIndirect(Info);
finally
DeleteObject(Info.hbmMask);
DeleteObject(Info.hbmColor);
end;<br>
// nun ist Cursor ein reguläres Object unseres Processes
// weise es einem Icon zu, ist das gleiche, das Icon
// zerstört dann schon selber das Handle<br>
Icon := TIcon.Create;
try
Icon.Handle := Cursor;
Image.Picture.Assign(Icon);
finally
Icon.Free;
end;
end;
end;
</pre>
Gruß Hagen