我正在尝试使用Python.net在Winforms应用程序中添加一个自定义IMessageFilter,但我得到了一个段错误。
下面是一个最小的示例应用程序:
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()如果您按所示方式运行此代码,应用程序窗口将会显示,但您会立即得到一个段错误(我假设这是将第一条消息传递给过滤器的时候)。段故障是完全不透明的。没有堆栈跟踪或其他有用的细节-它只是操作系统级别的段错误处理程序。
如果注释掉第25行(app.AddMessageFilter(f),安装实际的过滤器),代码就能正常工作。
如果修改MessageFilter,使其不是Winforms.IMessageFilter的子类,您会得到一个错误,指出没有与给定参数匹配的AddMessageFilter方法。
如果重命名或删除PreFilterMessage()方法,您会得到一个错误,指出Python对象没有PreFilterMessage方法。
对我做错了什么,以及/或者如何修复它有什么建议吗?或者如何获得更多的调试信息,以指向Segfault源?
发布于 2019-10-03 08:11:07
这似乎是Python.net本身的一个错误,与编组byref参数的问题有关。详情可以在here上找到。
https://stackoverflow.com/questions/58157606
复制相似问题