参考:
- wine 8.14
作用:此函数的作用是执行window procedure.
static result call_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, enum message_type type, BOOL same_thread, enum wm_char_mapping mapping, BOOL ansi_dst)
{
......
if(msg & 0x80000000)
return handle_internal_message(hwnd, msg, wparam, lparam);
if(!is_current_thread_window(hwnd)) return 0;
packed_size =user_message_size(hwnd, msg, wparam, lparam, type == MSG_OTHER_PROCESS, ansi);
......
cwp.message = msg;
......
call_message_hooks(WH_CALLWNDPROC, HC_ACTION, same_thread, (LPARAM)&cmp, sizeof(cmp), packed_size, ansi);
......
if(!init_window_call_params(params, hwnd, msg, wparam, lparam, ansi_dst, mapping))
{
......
}
if(type == MSG_OTHER_PROCESS) params->ansi = FALSE;
if(packed_size)
pack_user_message((char *)params + offset, packed_size, msg, wparam, lparam, ansi);
result = dispatch_win_proc_params(params, offset+packed_size, &ret_ptr, &ret_len);
......
cwpret.lResult = result;
......
call_window_hooks(WH_CALLWNDPROCRET, HC_ACTION, same_thread, (LPARAM)&cwpret, sizeof(cwpret), packed_size, ansi);
}
首先对msg、hwnd的合理性进行检查,之后需要在调用window procedure之前执行WH_CALLWNDPROC hooks,调用window procedure之后执行 WH_CALLWNDPROCRECT,这么做的原因请参考https://learn.microsoft.com/en-us/windows/win32/winmsg/about-hooks#wh_callwndproc-and-wh_callwndprocret。 在函数init_window_call_params和pack_user_message对 param进行处理之后,函数dispatch_win_proc_params执行具体的调用window procedure的操作。