Если рассматриваемый поток часто входит в состояние ожидания с оповещением, вы можете отправить ему APC с QueueUserAPC ; обработчик APC может затем вызвать GetCurrentThreadId и передать результат обратно вызывающей стороне, используя любой метод, который вам нравится.
Вы также можете сделать это с недокументированными функциями NT. Использование NtQueryInformationThread () в классе ThreadBasicInformation даст вам идентификатор потока в возвращаемой структуре . Пример можно найти в винном источнике . Однако я не уверен, в каких версиях окон это доступно - имейте в виду, что эти недокументированные функции могут измениться в любое время, поэтому лучше всего протестировать их на более старых версиях интересующих вас окон и просто использовать GetThreadId () где это доступно.
Обратите внимание, что эти недокументированные функции доступны только для LoadLibrary () и GetProcAddress () в NTDLL; у них нет библиотеки импорта. Согласно MSDN , декларации для структур данных можно найти в Winternl.h
, но если нет, просто определите их сами, основываясь на ссылках ntinternals выше.