Aehm ja,
ich wollte eben mal ein Minimalbeispiel machen, damit wir hier nicht Äpfel mit Birnen vergleichen.
Da ist mir folgendes aufgefallen.
1. hatte ich die Unit jwawinuser in der uses Liste. Diese definiert SetWindowLongPtr ebenfalls.
2. hatte ich den Aufruf innerhalb der Methode Loaded des Formulars. Das war zu früh, dann kam die Fehlermeldung "Das Fenster hat keine Bildlaufleisten" ?!?
Jetzt habe ich es im EventHandler OnShow untergebracht und da funktioniert es in beiden Fällen.
Code: Alles auswählen
var
PrevWndProc: WNDPROC = nil;
PrevWndProcPtr : PtrInt absolute PrevWndProc; // Nur für Fehlermeldung
function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam):LRESULT; stdcall;
begin
result:=CallWindowProc(PrevWndProc,Ahwnd, uMsg, WParam, LParam);
end;
{ TForm1 }
procedure TForm1.FormShow(Sender: TObject);
var errno : integer;
begin
SetLastError(0); // Das steht bei MSDN zu SetWindowLongPtr
PrevWndProc:=windows.WNDPROC(SetWindowLongPtr(Handle,GWLP_WNDPROC,PtrInt(@WndCallback)));
errno := GetLastError();
if errno <> 0 then
MessageDlg(Format('Kann die WndProc nicht setzen. (%d) Fehler: %s', [PrevWndProcPtr, SysErrorMessage(errno)]), mtWarning, [mbOk], 0)
else
MessageDlg('wndproc erfolgreich gesetzt', mtInformation, [mbOk], 0);
end;