Эта строка кода должна быть:
backupproc = (WNDPROC)SetWindowLongPtr(hmmitem, GWLP_WNDPROC,(LONG_PTR)EditProc);
Но Рэймонд такой быстрый !:)
Редактировать: Джонатон Поттер комментирует выше, что есть лучший способ сделать это (и это рекомендованный Microsoft способ).Поэтому, пожалуйста, не обращайте внимания на вышеприведенное и создайте подкласс для своего окна следующим образом:
SetWindowSubclass (hmmitem, EditProc, EditProcSubclassID, EditProcReferenceData);
Где:
EditProcSubclassID
- это уникальный идентификатор на ваш выбор (просто создайте его). EditProcReferenceData
будет передан EditProc
всякий раз, когда он вызывается.Вы можете использовать это для чего угодно (или просто передать 0).
Затем вы реализуете EditProc
следующим образом (обратите внимание на два дополнительных параметра в конце):
LRESULT CALLBACK EditProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
...
}
Так что же случилось с backupproc
?Ну, тебе это больше не нужно.Вместо этого, чтобы вызвать следующий WndProc в цепочке, вызовите DefSubclassProc()
(или нет, если вы хотите проглотить сообщение) в конце EditProc
.
Наконец, если вы хотите отсоединить EditProc
из окна позвоните RemoveWindowSubclass()
.
Основным преимуществом этого подхода является то, что он работает правильно, если кто-то еще подклассирует окно после вас (или даже раньше, если он хочет удалить свой WndProcпрежде чем ты сделаешь).Вот почему вы должны его использовать.
Прочитайте документацию SetWindowSubclass
на MSDN и посмотрите блог Раймонда по Безопасное создание подклассов .