Жесть.
Код:
s := '$' + inttohex(MSG.wParam, 1);
i := StrToInt(s);
IntToHex - это цикл из shr, and и +. На 4-байтовое число примерно операций 80-100. + выделение памяти под строку (очень долго) и сложение строк.
StrToInt то же самое, только в обратную сторону (еще ~100 команд минимум).
В то время как (wParam and $80000000) = 0 компилируется в одну команду. И integer(wParam) > 0 тоже. Лучше поподробней разберись с этими вариантами, чтобы не мучить комп бесполезными вычислениями.
И вообще, в любом языке надо минимально пользоваться строками. Поскольку бинарные данные априори быстрее строк раз в 100 как минимум.