Всё, разобрался. Не надо было первичный поток приостанавливать. Может это и неправильно, но это работает.
Код:
void __fastcall TMainForm::tvWindowsChange(TObject *Sender, TTreeNode *Node)
{
if (Node->Selected == false) return;
param.hwnd = (HWND) Node->Data;
StartUpdate();
}
DWORD WINAPI ThreadProcGeneral (LPVOID lparam) {
TThreadParam *param = (TThreadParam *) lparam;
DWORD error;
HANDLE currentThreadHandle = OpenThread (THREAD_ALL_ACCESS,
FALSE, GetCurrentThreadId());
TComponent *owner = param->owner;
TLabeledEdit *lEdit =
(TLabeledEdit *) owner->FindComponent("leHandle");
while (true) {
HWND hwnd = param->hwnd;
if (hwnd == NULL) {
continue;
}
lEdit->Text = "0x" + IntToHex((int) hwnd, 8); // вот тут уже не зависает
SuspendThread (currentThreadHandle);
}
return 0;
}