- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 CreateProcess 打开一个窗口,但我在理解 SetWinEventHook 时遇到了很多麻烦。
在调用函数中,我有:
HWINEVENTHOOK hook = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_CREATE, NULL, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT );
BOOL result = CreateProcess(0, arguments,
NULL, NULL, FALSE, 0, NULL,
NULL, &StartupInfo, &ProcessInfo)
if (hook) {
UnhookWinEvent(hook);
}
创建过程顺利进行,但未调用链接到 SetWinEventHook 的 WinEventProc 函数。为了让 WinEventProc 被调用,我尝试了这样的事情:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0);
在 createProcess 调用之后,但我不知道如何结束 while 循环以便它连续进行。
我读了很多书,但我不明白如何使用 SetWinEventHook 来捕获由 CreateProcess 启动的进程。感谢您的帮助!
最佳答案
您可能需要完整且有效的事件循环 - 尝试:
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
如果您的应用程序不是 GUI 应用程序——或者更具体地说,如果您除了 Hook 之外不需要事件循环——您可以添加另一个线程并在那里使用上面的事件循环(以及所有 Hook 和取消 Hook )我想),或者将 PeekMessage
与 GetMessage
结合使用来创建非阻塞事件循环并定期调用它。
其次,您不应在调用 CreateProcess
后直接删除 Hook 。窗口的创建通常发生在程序完全加载和初始化之后,这个过程可能需要一段时间。 CreateProcess
异步工作,这意味着它不会在退出之前等待所有这些发生。
第三,为了能够接收任何类型的 Hook 消息,您的消息循环需要在 SetWinEventHook
和 UnhookWinEvent
之间执行 - 在任何其他情况下您都不会得到任何东西.
最后,为了避免来自其他进程的消息被传递到您的进程,您应该使用 CREATE_SUSPENDED
标志启动您的应用程序,使用适当的进程 ID 启动您的 Hook ,然后通过使用恢复进程执行ResumeThread
具有从 CreateProcess
获得的主线程句柄。
总体而言,它应该是这样的:
BOOL result = CreateProcess(0, arguments,
NULL, NULL, FALSE, CREATE_SUSPENDED, NULL,
NULL, &StartupInfo, &ProcessInfo);
HWINEVENTHOOK hook = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_CREATE, NULL, WinEventProc, ProcessInfo.dwProcessId, 0, WINEVENT_OUTOFCONTEXT );
ResumeThread(ProcessInfo.hThread);
// If you don't have an event loop function in your application already, then you could insert a temporary one here.
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
如果您的应用程序不是事件驱动的 - 只是常规的顺序应用程序,那么您应该定期调用上述事件循环直到您的 WinEventProc
执行 - 您可能应该添加一些安全变量以查看它是否已经执行.另一个好主意可能是包括一些超时(2-3 分钟?),以防没有发布任何事件(应用程序崩溃,应用程序由于某种原因没有创建对象)。为简单起见,我还跳过了任何错误检查。
你的钩子(Hook)程序应该做类似的事情:
void CALLBACK WinEventProc(
HWINEVENTHOOK hWinEventHook,
DWORD event,
HWND hwnd,
LONG idObject,
LONG idChild,
DWORD dwEventThread,
DWORD dwmsEventTime)
{
// This will handle the re-entrance problem nicely.
UnhookWinEvent(hWinEventHook);
// Do wathever you need to do with a window here.
[...]
}
编辑:
至于跳过消息循环——是的,这就是这个消息循环应该做的。
哪种消息循环最适合您取决于您的程序构造 - 如果您已经运行了一个偶数循环(Qt、MFC 等 GUI 框架......通常已经为您实现),那么您不需要无论如何添加任何。如果您希望您的应用程序等到 WinEvent 交付,那么您应该这样做:
//Global variable for stop-condition:
bool docontinue = false;
void CALLBACK WinEventProc(
HWINEVENTHOOK hWinEventHook,
DWORD event,
HWND hwnd,
LONG idObject,
LONG idChild,
DWORD dwEventThread,
DWORD dwmsEventTime)
{
// This will handle the re-entrance problem nicely.
UnhookWinEvent(hWinEventHook);
// Do wathever you need to do with a window here.
[...]
docontinue = false;
}
钩子(Hook)函数应该做的:
// In hooking function use:
docontinue = true;
MSG msg;
while (GetMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if (!docontinue)
break;
}
这是最幼稚的方法,它有几个缺点,但如果您只需要执行一个简单的操作,那么它可能对您来说就足够了。
关于c++ - SetWinEventHook 与 CreateProcess,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20732086/
我正在使用 Android Studio。我想在 github 上分享我的项目,但我遇到了很多问题。 首先,Android studio找不到git.exe。我可以用某种方式解决那个问题,但现在是下一
今天,我刚刚使用 Android SDK 管理器更新了 Windows 7 上的 Android SDK,并在 Eclipse 中构建期间开始出现错误 "Error executing aapt: C
由于某种原因创建进程打开cmd即使未指定按 Enter 键会导致命令行中弹出更多 cmd 实例。 #include #include void main() { PROCESS_INFOR
这个问题已经有答案了: Unhandled Error with CreateProcess [duplicate] (2 个回答) 已关闭 4 年前。 我的目标是在我的程序中执行外部可执行文件。首先
当使用 CreateProcess 运行另一个程序时,捕获标准输出的推荐方法是什么?也就是说,将第二个程序打印到 stdout 的任何内容,并以第一个程序可以分析它的数组结束? 这两个程序都是用 C
这个问题在这里已经有了答案: Unhandled Error with CreateProcess [duplicate] (2 个答案) 关闭 4 年前。 我的目标是在我的程序中执行一个外部可执行
我的以下代码有问题: int main(int argc, char **argv) { PROCESS_INFORMATION pi; STARTUPINFO si; prin
forking() 和 CreateProcess(带有所有必需的参数)对于 Linux 和 WinXP 是否分别是相同的? 如果它们不同,那么有人可以解释两种情况下发生的情况的差异吗? 谢谢 最佳答
我正在寻找 Delphi 中 CreateProcess 的快速替代方案,以在 exe 中执行某些计算,包括 XML 中的多个返回值。目前,我正在调用带有特定参数的 C#-exe。这些电话之一需要大约
我有我的主应用程序,从我的主应用程序我将调用另一个 模块(第三方)在我的主应用程序中执行一个小操作,当我调用该模块时..它处理特定时间说 5 秒。而它的处理它在命令窗口中显示了一些信息..现在我的主应
我注意到了这种行为: 当前目录下有2个可执行文件,分别名为“somefile”和“somefile.abc”。 CreateProcessA(NULL, "somefile", ...) - 失败,错
C 初学者警告!!! 我正在用 c 编写一个应用程序,该应用程序应该在“cmd.exe”上下文中运行用户定义的命令并将输出写入变量。例如,如果命令变量是“dir C:\”,则 c 程序应使用 Crea
我正在尝试使用 CreateProcess() 启动服务器。这是代码: int APIENTRY WinMain(HINSTANCE hInstance, H
所以我使用这段代码来启动带有参数的控制台应用程序: #include #include using namespace std; void StartProgram(char argv[]) {
我刚刚安装了代码块 我在安装时遇到错误(无法在 gcc gnu 中配置的路径中找到编译器可执行文件) 所以我安装了编译器MinGW出现这个错误 错误: *CreateProcess:没有这样的文件或目
我正在尝试弄清楚如何使用 CreateProcess() 函数,但我不太精通 C++。我已经尝试了一些方法来尝试让错误消失,但应用程序似乎没有按照我期望的方式执行。 我想做的是将“cmd.exe/c
我有一个应用程序,用户可以在其中将文件上传到远程服务器,接收该文件的同一台服务器应该运行该应用程序。我正在使用 CreateProcess 方法。问题是,文件目录已经在 std::字符串中定义,我很难
如果程序A被用户以管理员身份执行,程序A是否可以使用CreateProcess() windows函数以管理员权限启动程序B?提前谢谢你 最佳答案 答案是肯定的。如果启动程序以提升的方式运行,您可以以
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在尝试在 windows 7 上的 windows visual studio 2012 professional 上使用 visual c++ 打开一个程序。代码将顺利运行,但实际上不会打开程序
我是一名优秀的程序员,十分优秀!