Я пытаюсь добавить пользовательский IMessageFilter
в приложение Winforms, использующее Python.net, но у меня возникает ошибка.
Вот минимальный пример приложения:
import clr
clr.AddReference("System.Windows.Forms")
import System.Windows.Forms as WinForms
class MessageFilter(WinForms.IMessageFilter):
__namespace__ = 'System.Windows.Forms'
def PreFilterMessage(self, message):
print('filter', message)
return False
class HelloApp(WinForms.Form):
def __init__(self):
self.textbox = WinForms.TextBox()
self.textbox.Text = "Hello World"
self.Controls.Add(self.textbox)
def main():
form = HelloApp()
app = WinForms.Application
f = MessageFilter()
app.AddMessageFilter(f)
app.Run(form)
if __name__ == '__main__':
main()
Если вы запустите этот код, как показано, появится окно приложения, но вы сразу получите ошибку (я полагаю, это когда первое сообщениеперешел на фильтр). Segfault полностью непрозрачен. Там нет трассировки стека или других полезных деталей - это просто обработчик сегфоута на уровне ОС.
Если вы закомментируете строку 25 (app.AddMessageFilter(f)
, устанавливая реальный фильтр), код работает нормально.
Если вы измените MessageFilter
так, чтобы он не делился на подкласс Winforms.IMessageFilter
, вы получите сообщение о том, что нет метода AddMessageFilter
, соответствующего указанным аргументам.
Если вы переименуете или удалите PreFilterMessage()
метод, вы получаете сообщение об ошибке, что у объекта Python нет PreFilterMessage
метода.
Есть предложения о том, что я делаю неправильно, и / или как это исправить? Или как получить больше отладочной информации, которая могла бы указывать на источник segfault?