通过回调更新类属性

Updating a class attribute through a callback

本文关键字:属性 更新 回调      更新时间:2023-10-16

我正在构建一个需要根据活动窗口/程序加载不同设置的应用程序(例如,如果您使用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时(使用

)
    AfxBeginThread(&messageCheck, &currentProgram, THREAD_PRIORITY_NORMAL, 0, 0,NULL) 

)

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

2)我不知道如何从回调中修改RecipeBook中的值。我想过从回调中返回名称,但我没有设法使其工作。如果我能在回调中编辑字符串就好了。

3)每当调用LookUp方法时,我想只是请求当前活动的程序,但我只能找到获得调用进程ID的方法,而不是活动的windows进程ID。

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

谢谢!

GetForgroundWindow()

这就是我要找的!

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633505 (v = vs.85) . aspx

出于某种原因,我试图使用GetActiveWindow(),每当我看到Forground窗口出于某种原因,我在想后台窗口。糟糕!

除非有人能提供一个很好的解释如何做多任务,CALLBACK的东西,我将只是使用这个函数和查询当前窗口每当一个查找完成。不应该那么频繁,这个过程不会花太长时间。

对于任何对如何使用窗口句柄从活动窗口/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);

干杯!