在C ++中创建TNotifyEvent以在应用程序级别使用

时间:2011-08-25 15:36:05

标签: c++ hook c++builder

我需要在C ++ Builder中挂钩Application的OnDeactivate事件。因此,当OnDeactivate事件触发应用程序时,我需要编写自己的函数来运行,但我不知道在哪里或如何定义该函数。

理想情况下,我希望我的代码看起来像这样:

WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
  try
  {
     Application->Initialize();
     Application->OnDeactivate = myFunction;
     Application->Run();
   }

后:

 void myFunction(TObject *Sender)
 {
 //Do Stuff
 }

当我在.cpp文件中这样写时,它会抱怨

  

无法将'void(*)(TObject *)'转换为'TNotifyEvent'

如果我改变我的功能以返回TNotifyEvent(无论如何都不行),它会给我带来一个搞笑的错误

  

无法将'TNotifyEvent'转换为'TNotifyEvent'

那么,我该如何编写一个函数来挂钩我的Application属性呢?

2 个答案:

答案 0 :(得分:2)

您正在尝试分配一个独立的函数,而不希望使用非静态类方法。你有两个选择:

1)将您的事件处理程序移动到辅助类中:

class Helper
{
public:
    void __fasycall myFunction(TObject *Sender)
    {
        ...
    }
};

WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    try
    {
        Application->Initialize();

        Helper helper;
        Application->OnDeactivate = &helper.myFunction;
        ...
    }
    ...
}

2)将函数保留为非类函数,但为其提供额外参数以接收编译器的this指针,然后使用TMethod结构来帮助您将其传递给事件作为合适的TNotifyEvent

void __fasycall myFunction(void *pThis, TObject *Sender)
{
    ...
}

WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    try
    {
        Application->Initialize();

        TMethod m;
        m.Data = NULL; // passed to the pThis parameter, can be whatever you want
        m.Code = &myFunction;
        Application->OnDeactivate = reinterpret_cast<TNotifyEvent&>(m);
        ...
    }
    ...
}

如上所述,如果未分配MainForm,TApplication::Run()将立即退出,因此最简单的解决方案是将TApplicationEvents组件放到MainForm上,然后分配{{1}在设计时将事件处理程序发送给它。

更新:或者,如果您的项目包含任何OnDeactivateTForm个对象,您只需将TDataModule组件放在其中一个组件上,然后分配它在设计时的TApplicationEvents事件处理程序。然后它将为您挂钩应用程序的OnDeactivate事件。

答案 1 :(得分:0)

你几乎就是这样。

我所做的是创建一个包含各种动作的TActionList。我使用以下代码创建了一个将在表单OnCreate事件上调用的操作:

void __fastcall TForm1::onCreateActionExecute(TObject *Sender)
{
 Application->OnDeactivate = MyAppDeactivate;
}

然后在我的表单中添加了一点测试功能:

void __fastcall MyAppDeactivate(TObject *Sender) { ShowMessage("Deactivate"); };

就是这样。