调用的函数与发送的邮件的作用相同,而不是调用SendMessage()
吗?
例如,case WM_RBUTTONUP:
中的代码更快,调用EnableTwoWindows(firstWnd, secondWnd);
或发送SendMessage(hwnd, CUSTOM_MESSAGE_ENABLE_TWO_WINDOWS, 0, 0);
?调用函数与发送消息有什么优缺点?
void EnableTwoWindows(HWND hwnd1, HWND hwnd2)
{
EnableWindow(hwnd1, TRUE);
EnableWindow(hwnd2, TRUE);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HWND firstWnd, secondWnd;
switch(msg)
{
case CUSTOM_MESSAGE_ENABLE_TWO_WINDOWS:
EnableWindow(firstWnd, TRUE);
EnableWindow(secondWnd, TRUE);
break;
case WM_RBUTTONUP:
//EnableTwoWindows(firstWnd, secondWnd); //Is calling this function faster? or
//SendMessage(hwnd, CUSTOM_MESSAGE_ENABLE_TWO_WINDOWS, 0, 0); //Is sending message faster?
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
答案 0 :(得分:8)
直接调用此函数比通过SendMessage
调用更快。
当您查看SendMessage
的作用时,可以很容易地推断出这一点:首先需要确定目标窗口是否属于同一个线程,如果是,则检索窗口过程,最后调用这一点。
如果目标窗口由另一个线程拥有,则代价更高,因为SendMessage
调用必须在目标线程的队列中排队消息,等待它调用消息检索函数,并且只能在目标线程调度消息并生成返回值时返回。但是,在这种情况下,调用SendMessage
强制。从拥有线程以外的线程操作窗口会导致未定义的行为。 SendMessage
确保操作在拥有窗口的同一线程上运行。
此外,编译器可以内联直接函数调用。调用SendMessage
时无法做到这一点,因为编译器无法看到它的实现。
性能不是问题:您正在响应用户输入。用户是瓶颈。另一方面,正确性至关重要。如果需要决定,请使用以下规则:如果您正在操作的窗口由调用线程以外的线程拥有,请使用SendMessage
。如果窗口由调用线程拥有,请进行直接函数调用。