Запуск второго цикла сообщений в одном потоке не является допустимой операцией.

Я пытаюсь переопределить метод «wndProc» для моей winform. Так что я могу реализовать свой собственный метод wndproc для конкретных сообщений. Я умею это успешно делать. Однако теперь я столкнулся с другой проблемой, с которой никогда раньше не сталкивался.

После успешной компиляции я запустил программу, и она выскочила со следующим сообщением об ошибке: «Запуск второго цикла сообщений в одном потоке не является допустимой операцией. Вместо этого используйте Form.ShowDialog».

Мой переопределенный метод winproc в спецификаторе защищенного доступа:

method WndProc(var m:Message); override;

Мое определение метода winproc выглядит следующим образом:

method MainForm.WndProc(var m: Message);
const WM_NCLBUTTONDOWN = 161;
const WM_SYSCOMMAND = 274;
const HTCAPTION = 2;
const SC_MOVE = 61456;
begin
    if ((m.Msg = WM_SYSCOMMAND) and (m.WParam.ToInt32 = SC_MOVE)) then
    begin
        exit;
    end;

    if ((m.Msg = WM_NCLBUTTONDOWN) and (m.WParam.ToInt32 = HTCAPTION)) then
    begin
        exit;
    end;
end;

Ошибка возникает в файле program.pas:

[STAThread]
class method Program.Main(args: array of string);
begin
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.ThreadException += OnThreadException;
  using lMainForm := new MainForm do
    Application.Run(lMainForm); < --------Raised here.
end;

Как мне это решить?


person ThN    schedule 04.01.2012    source источник
comment
Хм, это должно генерировать другое исключение, Ошибка создания дескриптора окна. Вы должны вызвать базовый метод в своем переопределении. Опубликуйте трассировку стека исключения, если это не поможет.   -  person Hans Passant    schedule 04.01.2012
comment
@HansPassant Ты прав. Я также видел ошибку при создании дескриптора окна.   -  person ThN    schedule 04.01.2012


Ответы (2)


Вам не нужно переопределять WndProc, и вы действительно не хотите этого делать из-за проблемы, с которой вы столкнулись. Все, что вам нужно сделать, это создать процедуру, которая обрабатывает конкретное сообщение, которое вы хотите, чтобы она обрабатывала, и объявить ее как обработчик сообщений следующим образом:

procedure HandleSysCommand(var Msg: TWMSysCommand) ; message WM_SYSCOMMAND;

«Сообщение WM_SYSCOMMAND» — это то, что сообщает вашему приложению, какое сообщение Windows вы обрабатываете, и вы можете использовать его для перехвата любого стандартного или пользовательского сообщения. Для получения более подробной и более подробной информации довольно легко выполнить поиск «Delphi Handle Windows Messages», чтобы получить все, что вам нужно, чтобы позаботиться обо всех ваших потребностях в обмене сообщениями.

person Tom A    schedule 04.01.2012

Как намекнул HansPassant, я включил базовый класс wndproc, и он работает.

В Delphi-Prism мы делаем это.

унаследовал WndProc(var m);

то же, что и base.wndproc(m);

person ThN    schedule 04.01.2012