我在Delphi应用程序中遇到问题,确定当前应用程序(当前线程)句柄.我知道我可以使用Windows API函数获取当前线程ID GetCurrentThreadID,但我需要当前的Thread句柄作为另一个Windows API函数SuspendThread的param.
实际上我想要做的是让我的旧dll之一用于挂钩kernel32.dll中的API函数,OpenProcess或者TerminateProcess也用于挂钩SuspendProcess.Hook位于dll文件中,使用SetWindowsHookEx注入正在运行的进程,然后查找目标函数的基址.挂钩函数如TerminateProcess我没有问题,因为它需要进程ID作为param,很容易在主应用程序中使用GetCurrentProcessID.要为SuspendThread函数创建类似的钩子,我需要将线程句柄作为参数传递.
只有我找到线程句柄的地方才是PROCESS_INFORMATION包含的结构
typedef struct _PROCESS_INFORMATION { // pi
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
Run Code Online (Sandbox Code Playgroud)
但问题是这个结构只有在用CreateProcessAPI函数创建进程后才可用.主要目标是防止程序用户使用ProcessExplorer等在线提供的不同工具来终止进程.我实现了成功挂钩TerminateProcess API调用并阻止关闭我的应用程序,但这些过程探索工具中的挂起选项可以暂停我的进程.它是互联网信息亭应用程序,用户无法关闭该应用程序至关重要.应用程序当前在Windows XP中运行,并且必须在管理员帐户上运行,因为用户在登录我的应用程序后使用的其他应用程序需要管理员帐户才能运行,因此我不能简单地在受限用户下运行我的应用程序.
有什么办法可以在Delphi中获得我的主应用程序主线程句柄吗?
提前致谢