А почему не 
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` для обработки сообщений в основном потоке.