我对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)处理程序一样,但我认为因为我使用一个单独的类我不能再这样做了。
任何提示?
答案 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或静态方法
通常Win32 API调用都有一个指向用户参数的指针,您可以使用它来简化:只需将指针强制转换为std::bind
并调用该函数。我在SessionSnatcher *
的参数列表中没有看到用户参数,因此您必须具有创意并映射其中一个事件ID或句柄WinEventProc
确实提供并唯一标识{{1 }}
或者,如果您只有一个WinEventProc
,则可以编写该函数以始终使用该SessionSnatcher
。
以下是一个通用示例:
SessionSnatcher
典型输出:
SessionSnatcher
“map :: at”不是一个异常消息,但它可以转换为有用的日志消息。无论如何,它在没有信息的情况下击败了一个段错误。