SetWinEvent在一个单独的类上

时间:2016-06-11 00:10:38

标签: c++ qt

我对Qt有点问题,这是我的代码:

SessionSnatcher.h:

#ifndef SESSIONSNATCHER_H
#define SESSIONSNATCHER_H

#include <Windows.h>
#include <QThread>
#include <QtCore>
#include <QDebug>


class SessionSnatcher : public QThread
{
public:
    SessionSnatcher();
    ~SessionSnatcher();
    void run();
    void SetPID(int pid);
    void SetTID(int tid);
    int GetPID();
    int GetTID();
    HWND GetCOProductControl();

private:

    //HWND GetCOProductControl();
    void CALLBACK SessionSnatcher::handler(HWINEVENTHOOK hook , DWORD event , LONG idChild , LONG idObject , DWORD dwEventThread , DWORD dwmsEventTime);
    HWINEVENTHOOK hook;
    int PID , TID;

};

#endif // SESSIONSNATCHER_H

SessionSnatcher.cpp:

#include "sessionsnatcher.h"

SessionSnatcher::SessionSnatcher()
{

}

SessionSnatcher::~SessionSnatcher()
{
    UnhookWinEvent(hook);
}

void CALLBACK SessionSnatcher::handler(HWINEVENTHOOK hook , DWORD event , LONG idChild , LONG idObject , DWORD dwEventThread , DWORD dwmsEventTime)
{

}

void SessionSnatcher::run()
{
    hook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND , EVENT_SYSTEM_FOREGROUND , NULL , &SessionSnatcher::handler , PID , TID , WINEVENT_OUTOFCONTEXT);
}



HWND SessionSnatcher::GetCOProductControl()
{
    HWND TPanel = FindWindow(L"TPanel" , NULL);
    return TPanel;
}

void SessionSnatcher::SetPID(int pid)
{
    PID = pid;
}

void SessionSnatcher::SetTID(int tid)
{
    TID = tid;
}

int SessionSnatcher::GetPID()
{
    return PID;
}

int SessionSnatcher::GetTID()
{
    return TID;
}

现在我一直收到这个错误:

D:\TT\sessionsnatcher.cpp:25: error: C2664: 'HWINEVENTHOOK SetWinEventHook(DWORD,DWORD,HMODULE,WINEVENTPROC,DWORD,DWORD,DWORD)' : cannot convert argument 4 from 'void (__stdcall SessionSnatcher::* )(HWINEVENTHOOK,DWORD,LONG,LONG,DWORD,DWORD)' to 'WINEVENTPROC'
There is no context in which this conversion is possible

在此之前我正在使用&#34; handler&#34;而不是&#34;&amp; SessionSnatcher :: handler&#34;但我有一个问题,说它是一个成员,它不能像这样使用。 现在我无法解决这个问题。 它在Visual Studio上运行良好当我尝试它时,我所要做的就是像(WINEVENTPROC)处理程序一样,但我认为因为我使用一个单独的类我不能再这样做了。

任何提示?

1 个答案:

答案 0 :(得分:2)

您已成为每个非静态类方法中隐藏的> The following packages have unmet dependencies: > gcc : > Depends:gcc-4.7(>=4.7.2-1~) but it is not going to be installed > Recommends: libc6-dev but it is not going to be installed or libc-dev 参数的牺牲品。一个现代的解决方案是使用std::bind,但这对C ++ 11之前的基于C的API或C ++ API没有帮助。

this不可用时的典型解决方案是free function或静态方法

  1. 符合您需要提供的原型,
  2. 将回调映射到对象,
  3. 在2中找到的对象上调用所需的方法。
  4. 通常Win32 API调用都有一个指向用户参数的指针,您可以使用它来简化:只需将指针强制转换为std::bind并调用该函数。我在SessionSnatcher *的参数列表中没有看到用户参数,因此您必须具有创意并映射其中一个事件ID或句柄WinEventProc确实提供并唯一标识{{1 }}

    或者,如果您只有一个WinEventProc,则可以编写该函数以始终使用该SessionSnatcher

    以下是一个通用示例:

    SessionSnatcher

    典型输出:

    SessionSnatcher

    “map :: at”不是一个异常消息,但它可以转换为有用的日志消息。无论如何,它在没有信息的情况下击败了一个段错误。