📄 message.c
字号:
bCallBack = TRUE;
hProcess = lpws->lpClass->hOwnerProcess;
}
else if( lpCallProc )
{ // 类是系统注册类, 但可能是被用户调用 CallWindowProc
if( lpCallProc != lpws->lpClass->wc.lpfnWndProc )
{
bCallBack = TRUE;
hProcess = lpws->hOwnerProcess;
}
else
{
;
}
}
else if( lpws->uState & WINS_INUSERPROC )
{ // 类是系统注册类, 但可能是被用户调用 SetWindowLong 去代替 为 用户的WndProc
bCallBack = TRUE;
hProcess = lpws->hOwnerProcess;
}
if( !lpCallProc )
lpCallProc = lpws->lpfnWndProc;
lpws->nSendCount++;
if( bCallBack )
{
CALLBACKDATA cd;
ASSERT( hProcess && lpCallProc );
cd.hProcess = hProcess;
cd.lpfn = (FARPROC)lpCallProc;
cd.dwArg0 = (DWORD)lpws->hThis;
lr = Sys_ImplementCallBack4( &cd, message, wParam, lParam );
}
else
{
//ASSERT( lpCallProc );
lr = lpCallProc( lpws->hThis, message, wParam, lParam );
}
lpws->nSendCount--;
#ifdef __DEBUG
#endif
return lr;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
BOOL WINAPI WinMsg_SendNotify( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
_LPWINDATA lpws;
if( hWnd == HWND_BROADCAST )
{
MSG msg;
if( message != WM_PAINT )
{
msg.message = message;
msg.wParam = wParam;
msg.lParam = lParam;
DoEnumTopLevelWindow( _PostAllTopLevel, (LPARAM)&msg, NULL );
return 1;
}
return 0;
}
lpws = _GetHWNDPtr( hWnd );
if( lpws && message != WM_PAINT )
{
if( lpws->dwThreadID == GetCurrentThreadId() )
{
return _CallWindowProc( lpws, NULL, message, wParam, lParam );
}
else
{
return AddMsgToThreadQueue( hWnd, message, wParam, lParam, QS_SENDMESSAGE );
}
}
return FALSE;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
BOOL WINAPI WinMsg_PostThread( DWORD dwThreadID, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
return _WinSys_PostThreadMessage( dwThreadID, uMsg, wParam, lParam );
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
void WINAPI WinMsg_PostQuit( int nExitCode )
{
_WinSys_PostThreadMessage( GetCurrentThreadId(), WM_QUIT, 0, 0 );
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
BOOL WINAPI WinMsg_Wait( void )
{
if( WAIT_OBJECT_0 == _WinSys_WaitMessage(INFINITE) )
return TRUE;
return FALSE;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
LRESULT WINAPI WinMsg_SendTimeout(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam,
UINT fuFlags, // send options
UINT uiTimeout, // time-out duration
LPDWORD lpdwResult // return value for synchronous call
)
{
LRESULT lret = 0;
_LPWINDATA lpws;
MSG msg;
if( hWnd == HWND_BROADCAST )
{
if( message != WM_PAINT )
{
msg.message = message;
msg.wParam = wParam;
msg.lParam = lParam;
DoEnumTopLevelWindow( _PostAllTopLevel, (LPARAM)&msg, NULL );
return 1;
}
return 0;
}
lpws = _GetHWNDPtr( hWnd );
if( lpws && message != WM_PAINT )
{
DWORD dwThreadID;
DWORD dwResult;
dwThreadID = GetCurrentThreadId();
if( dwThreadID == lpws->dwThreadID )
{
dwResult = _CallWindowProc( lpws, NULL, message, wParam, lParam );//Wnd_SendMessage( hWnd, uiMsg, wParam, lParam );
if( lpdwResult )
*lpdwResult = dwResult;
dwResult = TRUE;
}
else
{
dwResult = _CallThreadWindowProc( hWnd, message, wParam, lParam, uiTimeout, fuFlags, lpdwResult );
}
return dwResult;
}
return 0;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
LRESULT WINAPI WinMsg_Send( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
_LPWINDATA lpws;
LRESULT lr = 0;
if( message == WM_PAINT )
return FALSE;
//RETAILMSG( 1, ( "c1\r\n" ) );
if( hWnd == HWND_BROADCAST )
{ // send message to all top level
MSG msg;
msg.message = message;
msg.wParam = wParam;
msg.lParam = lParam;
DoEnumTopLevelWindow( _PostAllTopLevel, (LPARAM)&msg, NULL );
return 1;
}
//RETAILMSG( 1, ( "c2\r\n" ) );
lpws = _GetHWNDPtr( hWnd );
if( lpws )
{
//RETAILMSG( 1, ( "c3\r\n" ) );
if( lpws->dwThreadID == GetCurrentThreadId() )
{
//RETAILMSG( 1, ( "c4\r\n" ) );
lr = _CallWindowProc( lpws, NULL, message, wParam, lParam );
//RETAILMSG( 1, ( "c5\r\n" ) );
}
else
{
// different thread
//RETAILMSG( 1, ( "c6\r\n" ) );
WinMsg_SendTimeout( hWnd, message, wParam, lParam, SMTO_NORMAL, INFINITE, (LPDWORD)&lr );
}
return lr;
}
return lr;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
static BOOL CALLBACK _PostAllTopLevel( HWND hWnd, LPARAM lParam )
{
LPMSG p = (LPMSG)lParam;
ASSERT( p->message != WM_PAINT );
AddMsgToThreadQueue( hWnd, p->message, p->wParam, p->lParam, QS_POSTMESSAGE );
return TRUE;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
static BOOL HandlePosEvent( LPMSG lpMsg, BOOL fEnable )
{
int hitValue, fActive;
HWND hwndTopLevel;
HWND hwnd;
WPARAM wParam;
POINT pt;
DWORD dwExStyle = Win_GetLong( lpMsg->hwnd, GWL_EXSTYLE );
lpMsg->lParam = MAKELONG( lpMsg->pt.x, lpMsg->pt.y );
if( fEnable )
{
hitValue = (int)WinMsg_Send( lpMsg->hwnd, WM_NCHITTEST, 0, lpMsg->lParam );
if( hitValue == HTERROR )
return FALSE;
}
else
{ // disable
if( lpMsg->message == WM_LBUTTONDOWN ||
lpMsg->message == WM_RBUTTONDOWN )
{
if( !IsForegroundThread() )
{
Win_SetForeground( lpMsg->hwnd );
}
}
return FALSE;
}
if( lpMsg->message == WM_LBUTTONDOWN &&
(dwExStyle & WS_EX_INPUTWINDOW) == 0 )
{
hwndTopLevel = GetTopLevelParent( lpMsg->hwnd );
if( (GetWindowLong( lpMsg->hwnd, GWL_STYLE ) & WS_CHILD) && (hwnd = GetParent( lpMsg->hwnd )) != 0 )
{ // hwnd is child window
wParam = Win_GetLong( lpMsg->hwnd, GWL_ID );
// send notify message to parent
WinMsg_Send( hwnd, WM_PARENTNOTIFY, MAKELONG( WM_LBUTTONDOWN, wParam ), lpMsg->lParam );
}
fActive = (int)WinMsg_Send(
lpMsg->hwnd,
WM_MOUSEACTIVATE,
(WPARAM)hwndTopLevel,
(LPARAM)MAKELONG( hitValue, lpMsg->message ) );
//2004-09-09, delete, 暂时没用
//WinMsg_Send( lpMsg->hwnd, WM_SETCURSOR, (WPARAM)lpMsg->hwnd, MAKELONG( hitValue, lpMsg->message ) );
//
if( fActive == MA_ACTIVATE || fActive == MA_ACTIVATEANDEAT )
{ // active window if possible
if( !IsForegroundThread() || Win_GetActive() != hwndTopLevel )
{
Win_SetForeground( hwndTopLevel );
}
}
// discard mouse message or not
if( fActive == MA_NOACTIVATEANDEAT || fActive == MA_ACTIVATEANDEAT )
{ // discard mouse message
lpMsg->message = WM_NULL;
return FALSE; // discard message
}
}
//HANDLE_HIT:
if( hitValue != HTCLIENT )
{ // translate to not client message
lpMsg->message = lpMsg->message - WM_MOUSEFIRST + WM_NCMOUSEMOVE;
lpMsg->wParam = hitValue;
}
else // client mouse
{
pt = lpMsg->pt;
Win_ScreenToClient( lpMsg->hwnd, &pt );
lpMsg->lParam = MAKELONG( pt.x, pt.y );
}
return TRUE;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
static HWND GetChildWindow( HWND hWnd, POINT pt )
{
HWND hwndHas = 0;
POINT ptc;
RECT rc;
while( hWnd != hwndHas )
{
hwndHas = hWnd;
ptc = pt;
ScreenToClient( hWnd, &ptc );
GetClientRect( hWnd, &rc );
if( PtInRect( &rc, ptc ) )
{
hWnd = ChildWindowFromPointEx( hWnd, ptc.x, ptc.y, CWP_SKIPDISABLED|CWP_SKIPINVISIBLE );//Wnd_ChildFromPoint( hWnd, ptc, CWP_SKIPDISABLED|CWP_SKIPINVISIBLE );
if( hWnd == 0 )
return 0;
}
else
break;
//ASSERT( hWnd );
}
return hwndHas;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
DWORD WINAPI WinMsg_WaitForMultipleObjects(
DWORD nCount,
LPHANDLE pHandles,
BOOL fWaitAll,
DWORD dwMilliseconds,
DWORD dwWakeMask
)
{
UINT uiSize = (nCount + 1) * sizeof( LPHANDLE );
LPHANDLE pMsgHandles = BlockHeap_AllocString( hgwmeBlockHeap, 0, uiSize );
LPGWEDATA lpgwe = GetGWEPtr( GetCurrentThreadId() );
DWORD dwRetv = WAIT_FAILED;
if( pMsgHandles && lpgwe )
{
memcpy( pMsgHandles, pHandles, nCount * sizeof(LPHANDLE) );
pMsgHandles[nCount] = lpgwe->msgQueue.hWaitEvent;
while( 1 )
{
dwRetv = WaitForMultipleObjects( nCount + 1, pMsgHandles, fWaitAll, dwMilliseconds );
if( dwRetv == (WAIT_OBJECT_0 + nCount) )
{
if( lpgwe->msgQueue.dwEventMask & dwWakeMask )
break;
}
else
break;
}
BlockHeap_FreeString( hgwmeBlockHeap, 0, pMsgHandles );
}
return dwRetv;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
BOOL WINAPI WinMsg_Beep( UINT uType )
{
//return MessageBeep(uType);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -