static LRESULT CALLBACK button_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR id, DWORD_PTR ref_data) { static LONG defwndproc_counter = 0; LRESULT ret; struct message msg; if (ignore_message( message )) return pDefSubclassProc(hwnd, message, wParam, lParam); switch (message) { case WM_SYNCPAINT: break; case BM_SETSTATE: if (GetCapture()) ok(GetCapture() == hwnd, "GetCapture() = %p\n", GetCapture()); /* fall through */ default: msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; add_message(sequences, COMBINED_SEQ_INDEX, &msg); } if (message == WM_NCDESTROY) pRemoveWindowSubclass(hwnd, button_subclass_proc, 0); defwndproc_counter++; ret = pDefSubclassProc(hwnd, message, wParam, lParam); defwndproc_counter--; return ret; }
static LRESULT WINAPI WndProcSub(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR uldSubclass, DWORD_PTR dwRefData) { struct message msg; if(message == WM_USER) { msg.wParam = wParam; msg.procnum = uldSubclass; add_message(&msg); if(lParam) { if(dwRefData & DELETE_SELF) { pRemoveWindowSubclass(hwnd, WndProcSub, uldSubclass); pRemoveWindowSubclass(hwnd, WndProcSub, uldSubclass); } if(dwRefData & DELETE_PREV) pRemoveWindowSubclass(hwnd, WndProcSub, uldSubclass-1); if(dwRefData & SEND_NEST) SendMessage(hwnd, WM_USER, wParam+1, 0); } } return pDefSubclassProc(hwnd, message, wParam, lParam); }