⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 message.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -