Announcement

Collapse
No announcement yet.

aktuellen Maus-Cursor aus fremden Prozessen ermitteln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • aktuellen Maus-Cursor aus fremden Prozessen ermitteln

    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
Working...
X