2013-03-27 78 views
0

我建设,需要根据活动窗口/程序(例如加载不同设置的应用程序。如果您使用Chrome,Chrome浏览器的设置同伙被加载,当您切换到MS Word,MS Word设置被加载)。更新类属性通过回调

现在我正在从数据库中每一次获取正确的设置活动窗口的变化的一类。这个类还将有一个“LookUp”方法,它返回一个基于上次获取的设置的值。

来形容我试图在伪代码来实现:

1)不能得到的消息检查,以在运行:

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 
} 

我与这个有问题的单独的线程。如果我按顺序运行代码,它工作正常。当我尝试产卵messageCheck在一个线程(使用

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

它只是似乎并不像创建其他线程。

2)我不知道如何从回调中修改RecipeBook中的值。我已经想过从回调中返回名字,但我没有设法让它起作用。如果我可以在回调中编辑字符串,那将会很好。

3)我想的只是要求当前活动程序时的查找方法被调用,但我才能够找到获取调用进程的ID,而不是活动窗口的进程ID的方法。

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

谢谢!

+0

我的第一个想法是,AfxBeginThread需要线程函数来匹配特定的签名: UINT __cdecl MyControllingFunction(LPVOID pParam); 您应该能够检查AfxBeginThread调用的返回值以查看是否存在参数错误。 – Derek 2013-03-27 04:24:28

回答

0
GetForgroundWindow() 

这就是我一直在寻找的!

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

出于某种原因,我试图用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); 

干杯!