#include <iostream>#include <windows.h>// 编写函数打印指定线程的创建时间,要求接受一个线程句柄VOID GetThreadCreateTime(HANDLE Thread){ // 创建结构体用于保存获取到的和线程相关的时间戳 FILETIME CreateTime{}, ExitTime{}; FILETIME UserTime{}, KernelTime{}; // 使用函数获取到线程的创建时间 GetThreadTimes(Thread, &CreateTime, &ExitTime, &UserTime, &KernelTime); // 将时间戳转换为当前时区表示的时间 FILETIME LocalTime{}; FileTimeToLocalFileTime(&CreateTime, &LocalTime); // 将时间戳转换为时间结构体 SYSTEMTIME SystemTime{}; FileTimeToSystemTime(&LocalTime, &SystemTime); // 输出指定线程的创建时间 printf("%d 时 %d 分 %d 秒\n", SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond);}// 一个线程,输出参数指定的线程的创建时间DWORD CALLBACK WorkerThread(LPVOID Paramater){ // 通过强制类型转换获取到传入的线程句柄 HANDLE Thread = (HANDLE)Paramater; // 在当前线程中得到的实际上是主线程的伪句柄,也就是 -2,-2永远代表的都是当前的 // 线程,所以下面的函数,输出的就是当前线程的创建时间,而不是主线程的创建时间 GetThreadCreateTime(Thread); return 0;}int main(){ // 获取当前线程的伪句柄,计算当前线程的创建时间。线程的伪句柄始终是 -2,进程是 -1 HANDLE MainThread = GetCurrentThread(); // 在主线程中首先打印主线程的创建时间 GetThreadCreateTime(MainThread); // 如果想要其它线程计算出主线程的创建时间,绝对不能用伪句柄,转换方式如下 HANDLE TrueHandle{}; DuplicateHandle( GetCurrentProcess(), // 要转换的句柄在哪里 MainThread, // 要转换的句柄是谁 GetCurrentProcess(), // 将句柄拷贝到哪个进程的句柄表 &TrueHandle, // 转换后的句柄保存到哪里 0, FALSE, DUPLICATE_SAME_ACCESS); // 等待两秒钟,创建一个新的线程,将主线程的句柄传入,计算线程的创建时间 Sleep(2000); HANDLE Thread = CreateThread(NULL, 0, WorkerThread, (LPVOID)TrueHandle, 0, NULL); // 为了确保线程执行完毕,应该等待线程 WaitForSingleObject(Thread, INFINITE); return 0;}