А почему не 
PostThreadMessage?
- Код: Выделить всё
- program ThreadMessage;
 
 uses
 Windows, Classes;
 
 const
 // Определение константы для пользовательского сообщения
 Msg_createFILES = WM_USER + 1;
 
 var
 // Глобальная переменная для хранения идентификатора основного потока
 MainThreadId: DWORD;
 
 // Процедура для обработки сообщений в основном потоке
 procedure HandleMessage;
 var
 Msg: TMsg;
 begin
 // Проверка наличия сообщений в очереди сообщений
 if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
 begin
 // Обработка пользовательского сообщения Msg_createFILES
 if Msg.message = Msg_createFILES then
 begin
 WriteLn('Received message in main thread: ', Msg.wParam);
 end;
 // Обработка других сообщений
 TranslateMessage(Msg);
 DispatchMessage(Msg);
 end;
 end;
 
 // Определение подкласса TThread для выполнения кода во вспомогательном потоке
 type
 TMyThread = class(TThread)
 protected
 // Переопределение метода Execute для выполнения кода во вспомогательном потоке
 procedure Execute; override;
 end;
 
 // Реализация метода Execute для отправки сообщения из вспомогательного потока в основной
 procedure TMyThread.Execute;
 begin
 WriteLn('Sending message from secondary thread');
 PostThreadMessage(MainThreadId, Msg_createFILES, 2, 0);
 end;
 
 begin
 // Получение идентификатора основного потока
 MainThreadId := GetCurrentThreadId;
 
 // Создание и запуск вспомогательного потока с помощью класса TMyThread
 with TMyThread.Create(True) do
 begin
 FreeOnTerminate := True;
 Start;
 end;
 
 // Бесконечный цикл для обработки сообщений в основном потоке
 while True do
 HandleMessage;
 end.
Создается константа `Msg_createFILES` для определения пользовательского сообщения. Затем определяется глобальная переменная `MainThreadId` для хранения идентификатора основного потока. Процедура `HandleMessage` используется для обработки сообщений в основном потоке. Она проверяет наличие сообщений в очереди сообщений с помощью функции `PeekMessage` и обрабатывает пользовательское сообщение `Msg_createFILES`, выводя соответствующее сообщение в консоль.
Далее определяется подкласс `TMyThread` класса `TThread` для выполнения кода во вспомогательном потоке. Метод `Execute` этого класса переопределяется для отправки сообщения из вспомогательного потока в основной с помощью функции `PostThreadMessage`.
В главной части программы получается идентификатор основного потока с помощью функции `GetCurrentThreadId`. Затем создается экземпляр класса `TMyThread` и запускается с помощью свойства `Start`. В бесконечном цикле вызывается процедура `HandleMessage` для обработки сообщений в основном потоке.