C++ 通过回调更新类属性

C++ 通过回调更新类属性,c++,windows,visual-studio,events,callback,C++,Windows,Visual Studio,Events,Callback,我正在构建一个需要根据活动窗口/程序加载不同设置的应用程序(例如,如果您使用的是chrome,则会加载与chrome关联的设置,当您切换到MS Word时,会加载MS Word设置) 现在,我正在开发一个类,它可以在每次活动窗口更改时从数据库中获取正确的设置。此类还将具有一个“LookUp”方法,该方法根据上次获取的设置返回一个值 要描述我试图在伪代码中实现的内容: class RecipeBook{ public: RecipeBook(); HWINEVEN

我正在构建一个需要根据活动窗口/程序加载不同设置的应用程序(例如,如果您使用的是chrome,则会加载与chrome关联的设置,当您切换到MS Word时,会加载MS Word设置)

现在,我正在开发一个类,它可以在每次活动窗口更改时从数据库中获取正确的设置。此类还将具有一个“LookUp”方法,该方法根据上次获取的设置返回一个值

要描述我试图在伪代码中实现的内容:

class RecipeBook{
   public:
       RecipeBook();
       HWINEVENTEVENTHOOK hEvent;
       string currentProgram;
       static VOID CALLBACK WindowCallback(HWINEVENTHOOK hWinEventHook, 
                                           DWORD dwEvent,
                                           HWND hwnd, LONG idObject, 
                                           LONG idChild, 
                                           DWORD dwEventThread, 
                                           DWORD dwmsEventTime); //Actual callback
       void messageCheck(void*);
 }

 RecipeBook::RecipeBook(){
      this->hEvent = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, 
                                     EVENT_SYSTEM_FOREGROUND, 
                                     NULL,&WinEventProcCallback, 
                                     0, 0, 
                                     WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);

      Start messageCheck(void*) in separate thread
 }

 void messageCheck(void*){
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
    }

 }

 VOID CALLBACK WindowCallback(HWINEVENTHOOK hWinEventHook, 
                                           DWORD dwEvent,
                                           HWND hwnd, LONG idObject, 
                                           LONG idChild, 
                                           DWORD dwEventThread, 
                                           DWORD dwmsEventTime){

       Get the name of the active program from the HWND handle //This is working
       Update RecipeBook->CurrentProgram
 }
我在这方面遇到的问题是:

1) 无法使消息检查在单独的线程中运行。如果我按顺序运行代码,它可以正常工作。当我尝试在线程中生成messageCheck时(使用

)

它只是看起来不像是创建了另一个线程

2) 我不知道如何通过回调修改RecipeBook中的值。我曾想过从回调中返回名称,但我还没有成功地使其生效。如果我能在回调中编辑字符串就好了

3) 我想只要在调用查找方法时请求当前活动程序,但我只能找到获取调用进程ID的方法,而不是活动windows进程ID的方法

这是一个大问题,但任何建议都将不胜感激

谢谢

GetForgroundWindow()
这就是我要找的

出于某种原因,我试图使用GetActiveWindow(),每当我看到Forground窗口时,出于某种原因,我想到的是背景窗口。哎呀

除非有人能很好地解释如何进行多任务处理、回调之类的工作,否则我将只使用这个函数,在完成查找时查询当前窗口。不应该如此频繁,而且这个过程不会花费太长时间

对于任何对如何使用窗口句柄从活动窗口/PID获取进程名称感兴趣的人,我就是这样做的:

DWORD processID;
LPTSTR processName = new TCHAR[MAX_PATH];
DWORD nameSize = MAX_PATH;
HWND activeWindowH = GetForegroundWindow();
DWORD threadID = GetWindowThreadProcessId(activeWindowH,&processID);
HANDLE processHandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_QUERY_INFORMATION,FALSE,processID);
BOOL nameSuccess = QueryFullProcessImageName(processHandle,0,processName,&nameSize);

干杯

我的第一个想法是AfxBeginThread需要线程函数来匹配特定的签名:UINT\uu cdecl MyControllingFunction(LPVOID pParam);您应该能够检查AfxBeginThread调用的返回值,以查看是否存在参数错误。
DWORD processID;
LPTSTR processName = new TCHAR[MAX_PATH];
DWORD nameSize = MAX_PATH;
HWND activeWindowH = GetForegroundWindow();
DWORD threadID = GetWindowThreadProcessId(activeWindowH,&processID);
HANDLE processHandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_QUERY_INFORMATION,FALSE,processID);
BOOL nameSuccess = QueryFullProcessImageName(processHandle,0,processName,&nameSize);