我正在尝试在全球范围内捕获所有触摸事件。为此,我知道我可以在 UIView 类中挂钩触摸事件过程。我有编译的代码。我的钩子实现是
procedure touchesBeganDetour(self: id; _cmd: SEL; touches: NSSet; withEvent: UIEvent); cdecl;
begin
Sleep(1);
end;
然后我尝试用两种不同的方式来连接它。第一的:
constructor TTouchEventListener_IOS.Create;
var
FM1, FM2: Pointer
ViewClass: Pointer;
begin
inherited;
ViewClass := objc_getClass('UIView');
class_addMethod(ViewClass, sel_getUid('touchesBeganDetour:'), @touchesBeganDetour, 'v@:@@');
FM1 := class_getInstanceMethod(ViewClass, sel_getUid('touchesBegan:withEvent:'));
FM2 := class_getInstanceMethod(ViewClass, sel_getUid('touchesBeganDetour:'));
method_exchangeImplementations(FM1, FM2);
end;
这似乎是标准方法。第二个:
constructor TTouchEventListener_IOS.Create;
var
FM1
ViewClass: Pointer;
begin
inherited;
ViewClass := objc_getClass('UIView');
FM1 := class_getInstanceMethod(ViewClass, sel_getUid('touchesBegan:withEvent:'));
method_setImplementation(FM1, @touchesBeganDetour);
end;
据我了解,这也应该有效。我得到了“ touchesBegan:withEvent ”的实例,并且所有代码都执行没有错误。但是当我然后触摸模拟器屏幕时,代码在单元“ Macapi.ObjectiveC.pas ”中的“ DispatchToImportSuper ”内崩溃。我显然做错了什么,但我不知道是什么。如果这可行,就可以在不修改 Delphi 源代码的情况下监听触摸事件。
有人有什么想法吗?