因此,我正在尝试使用其PySide下载和IDAAPI将自定义工具栏添加到IDA 6.4。我尝试过仅通过创建一个工具栏来添加工具栏,但是由于它没有exec_()方法,因此无法在屏幕上将其获取,并且看起来我需要将其加载到类似

self.toolbar = self.addToolBar('var')


尽管在这种情况下,“自我”是一个窗口,但我认为我需要引用IDA的主窗口。有人知道我如何获得该参考吗?

评论

不是解决方案,而只是为了完整性:在IDA 6.7 +中,它们对此进行了重大改进:hexblog.com/?p=886

是的,我已经看到了,但是对于6.4并没有帮助,但是谢谢。通过构建一个我可以停靠的视图,我已经获得了大多数我需要的功能,它不如工具栏那么好,但是可以使用。

#1 楼

新的IDA 6.95 API

也许是因为他们看到了这个问题,也许是由于用户请求,所以发布了6.95版,其中包含两个用于创建菜单和工具栏的IDAPython API函数:create_menucreate_toolbar,所以现在可以

旧技巧-在6.95之前我一直使用的一个技巧是手动找到应用程序的主窗口,然后直接使用QT添加工具栏。 IDA只有一个主窗口。

添加一个工具栏,据我所知,IDA可以完全识别该工具栏。您可以选择打开和关闭它,也可以停靠和取消停靠,更改为高级模式也会自动显示它。但是,IDA不允许您在IDA 6.7及更高版本中向其添加操作(如hexblog.com/?p=886中所述)。

示例代码如下所示:

 for widget in QtGui.qApp.topLevelWidgets():
     if type(widget) == QtGui.QMainWindow:
         mainWindow = widget
         toolbar = mainWindow.addToolBar("My toolbar")

         # and now for adding stuff to our toolbar
         toolbar.addSeparator()
         toolbar.addWidget(...)


免责声明:请记住,如果这样做有风险,无记录且可能无法始终有效,请以这种方式查找主窗口。 IDA可能不喜欢您要更改其下面的内容。我确实使用了它,但是它可以正常工作,但是YMMV和UAYOR起作用。加载插件时可见,您
可能想要在查找主窗口时设置QTimer。
由于未记录,我使用了更多方法来查找主窗口。使用qApp.activeWindow()和/或qApp.focusWidget()并遍历其.parent()是不错的选择。

编辑:从IDA插件中处理不同的加载模式并在IDA应用程序尚未完全设置的情况下重新键入:

  def init(self):
    self.setup()

    return idaapi.PLUGIN_KEEP

  def setup(self):
    if not self.get_mainwindow():
      self.delay_setup()
      return

    # Add a toolbar like OP requested
    self.toolbar = self.get_mainwindow().addToolBar("My toolbar")
    self.toolbar.setIconSize(QtCore.QSize(16, 16))

    # Bonus: add a menue
    self.menu = QtGui.QMenu("My menu")
    self.get_mainwindow().menuWidget().addMenu(self.menu)

  def delay_setup(self):
    QtCore.QTimer.singleShot(1000, self.setup)

  def get_mainwindow(self):
    if self.mainwindow:
      return self.mainwindow

    app = QtGui.qApp
    widgets = [app.focusWidget(), app.activeWindow()] + app.topLevelWidgets()
    mainwidgets = filter(None, map(self.search_mainwindow, widgets))

    if mainwidgets:
      self.mainwindow = mainwidgets[0]

    return self.mainwindow

  def search_mainwindow(self, widget):
    while widget != None:
      if isinstance(widget, QtGui.QMainWindow):
        return widget
      widget = widget.parent()
    return None