Чтобы остановить любой вызов функции API, найдите ее в разделе implementation
в Windows.pas (или там, где объявлена интересующая функция) и установите точку останова. Это заботится о функциях, которые вы используете с динамическим связыванием во время загрузки. Для динамического связывания во время выполнения (LoadLibrary
и GetProcAddress
) вам понадобится другая техника. Переменная, которая получает результат GetProcAddress
, будет содержать адрес, по которому вы хотите разорвать, но я не знаю, как вручную установить точку останова по этому адресу.
Остановка в окне сообщения сложнее, так как сообщения могут быть получены во многих местах. Вместо этого вам придется использовать условные контрольные точки.
Чтобы перехватить большинство отправленных сообщений, вы можете поставить точку останова в TApplication.HandleMessage
на первой строке после вызова PeekMessage
. Установите условие равным Msg.Message = x
. HandleMessage
заботится о сообщениях, отправляемых в очередь сообщений основного потока для основного цикла сообщений Application.Run
, а также о модальных циклах сообщений VCL. Другие модальные диалоги (например, Windows.MessageBox
) не будут использовать его.
Наблюдать за отправленными сообщениями сложнее, поскольку ОС напрямую отправляет их в целевые оконные процедуры. Вам нужно будет установить точку останова в процедуре окна каждого интересующего вас класса окна. Вы можете получить большинство оконных классов VCL, поместив условную точку останова в Classes.StdWndProc
.
Имейте в виду, что условные контрольные точки могут быть очень медленными. Они работают отладчиком, помещая туда безусловную точку останова 1025 *, и когда ОС запускает ее, отладчик вступает во владение, проверяет условие и затем возобновляет выполнение, если условие не выполняется. Это может потребовать много накладных расходов, переключаясь между отладчиком и вашим приложением; программы получают лотов сообщений, поэтому, если вы можете найти способ избежать прерывания отладчиком вашей программы для проверки каждого из них , сделайте это.
Если это невозможно для того, что вы пытаетесь отлаживать, тогда я рекомендую опубликовать новый вопрос, в котором вы опишите проблему, которую действительно пытаетесь решить.