in einem meiner Programme möchte ich mittels
Code: Alles auswählen
PrevWndProc:=windows.WNDPROC(SetWindowLongPtr(Handle,GWL_WNDPROC,PtrUInt(@WndCallback)));
Hat jemand eine Idee was ich da tun kann?
Vielen Dank und schöne Grüße
Michael
Code: Alles auswählen
PrevWndProc:=windows.WNDPROC(SetWindowLongPtr(Handle,GWL_WNDPROC,PtrUInt(@WndCallback)));
Dann funktioniert bei dir ein 32 Bit Kompilat? Wie gesagt, bei mir funktioniert das mit Windows 7 auch in 32 Bit nicht.fliegermichl hat geschrieben: Ich hab hier Windows 10 64 Bit.
Code: Alles auswählen
GWL_WNDPROC = -(4);
[...]
GWLP_WNDPROC = -4;
http://docwiki.embarcadero.com/RADStudi ... it-WindowsRichtig:
SetWindowLongPtr(hWnd, GWLP_WNDPROC, LONG_PTR(@MyWindowProc));
Falsch:
SetWindowLong(hWnd, GWL_WNDPROC, Longint(@MyWindowProc));
Und als 32 Bit Kompilat unter 64 Bit Windows? Das ist was bei mir ebenfalls nicht funktioniert.fliegermichl hat geschrieben:Ja bei 32 Bit Windows 10 funktioniert es.
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;