调用的函数与发送的消息相同,而不是调用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;
}
Run Code Online (Sandbox Code Playgroud)
直接调用函数比通过SendMessage调用更快.
当您查看内容时,可以很容易地推断出这SendMessage一点:它首先需要确定目标窗口是否由同一个线程拥有,如果是,则检索窗口过程,最后调用它.
如果目标窗口由另一个线程拥有,则它会变得更加昂贵,因为SendMessage调用必须在目标线程的队列上排队消息,等待它调用消息检索功能,并且只能在目标线程具有时返回调度消息并生成返回值.但是,在这种情况下,必须打电话SendMessage.从拥有线程以外的线程操作窗口会导致未定义的行为.SendMessage确保操作在拥有窗口的同一线程上运行.
另外,编译器可以内联直接函数调用.调用时这是不可能的SendMessage,因为编译器无法看到它的实现.
性能不是问题:您正在响应用户输入.用户是瓶颈.另一方面,正确性至关重要.如果需要决定,请使用以下规则:如果您正在操作的窗口由调用线程以外的线程拥有,请使用SendMessage.如果窗口由调用线程拥有,则进行直接函数调用.