通过回调更新类属性
Updating a class attribute through a callback
我正在构建一个需要根据活动窗口/程序加载不同设置的应用程序(例如,如果您使用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, ¤tProgram, 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);
干杯!
- 从C++本机插件更新Vector3数组
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- 使用 RapidXML 更新C++中的 XML 节点和属性值
- 如何更新对象的属性
- 从高度动态的C 数据模型中更新QML:计时器与属性绑定
- MFC SDI在更改属性时从INI读取并更新视图字符串
- 更新对象的属性时遇到问题?
- C++(煤渣):无法在 keyDown 函数中更新对象的属性
- 在JIT期间更新方法属性
- 如何检查对象属性更新是否存在 std::map 键,否则插入一个新键?
- 指向节点的指针不更新节点属性
- c++ Boost属性树通过属性限定符更新现有节点
- C++使用set函数更新对象属性
- 通过回调更新类属性
- 更新矢量中的对象属性