Я попробовал ваш код, и он работает хорошо.Как вы сказали, он не загружал процессор на 100%, а занимал всего ~ 16%.
Я полагаю, что на обработку уходит много времени, это рисунок вашей формы или фоновые окна.(а не реализация wndproc).
Попробуйте ограничить количество перерисовок, которые ваша форма может делать в секунду, добавив ожидание
System.Threading.Thread.Sleep(10);
после этой строки:
Marshal.StructureToPtr(rc, m.LParam, false);
Сон 10 мс при перетаскиванииограничивает перерисовку вашей формы более 100 раз в секунду, оставляя неиспользуемым процессор…
РЕДАКТИРОВАТЬ: Забыл упомянуть, что добавление спящего режима изменило ~ 16% до ~ 12% на моем боксе.