Jetzt klapps ...
In TClipboard.open darf FClipboardWindow nicht das Application.Handle zugewiesen werden.
Wenn FClipboardWindow = 0 ist und somit AllocateHWnd(MainWndProc) verwendet wird, dann kann man die Zwischenablage mit anderen Anwendungen lesend und schreibend teilen ...
Da ich definitiv nicht genug von der Materie verstehe, habe ich die Clipbrd.pas im Originalzustand belassen, in myClipbrd.pas kopiert und dann in mein Project eingebunden.
In die CodeLib möchte ich das nicht posten, bevor sich das jemand angesehen hat der mehr davon versteht als ich. Der Code den man da findet funktioniert ...
Den Ruf will ich versauen ...
Die myclipbrd.pas hänge ich hier einfach an den Thread.
Kurz zu den Veränderungen:
1. Prvate Variable FNullhandle definiert
Code:
type
TClipboard = class(TPersistent)
private
FOpenRefCount: Integer;
FClipboardWindow: HWND;
FAllocated: Boolean;
FEmptied: Boolean;
FNullHandle:HWND; //---- Edit (hinzugefügt) ----
2. constructor überschrieben, FNullHandle:=0 definiert
Code:
constructor TClipboard.create; //---- Edit (hinzugefügt) ----
begin
FNullHandle:=0;
inherited Create;
end;
3. in TClipboard.open FClipboardWindow:=FNullHandle definiert damit Zwischenablage dem Owner AllocateHWnd(MainWndProc) zugewiesen wird
Code:
procedure TClipboard.Open;
begin
if FOpenRefCount = 0 then
begin
FClipboardWindow := FNullHandle; //---- Edit (von Application.Handle in FNullHandle geändert) ----
if FClipboardWindow = 0 then
begin
{$IFDEF MSWINDOWS}
FClipboardWindow := Classes.AllocateHWnd(MainWndProc);
{$ENDIF}
{$IFDEF LINUX}
FClipboardWindow := WinUtils.AllocateHWnd(MainWndProc);
{$ENDIF}
FAllocated := True;
end;
if not OpenClipboard(FClipboardWindow) then
raise
Exception.CreateRes(@SCannotOpenClipboard);
FEmptied := False;
end;
Inc(FOpenRefCount);
end;
Schöne Grüße,
Jens