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

📄 win.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:
// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static BOOL _Win_Enum( _LPWINDATA lpwsChild, BOOL bEnumChild, CALLBACKDATA * lpcd, LPARAM lParam )
{
    _LPWINDATA lpwsNext;
	BOOL bRetv = TRUE;

    while( lpwsChild )
    {
		if( lpwsChild == NULL )
		{
			bRetv = FALSE;
			SetLastError( ERROR_INVALID_HANDLE );
			break;			
		}

        lpwsNext = lpwsChild->lpwsNext;

		//LeaveCriticalSection( &csWindow );	//2004-03-31, call by caller
		if( lpcd->hProcess )
		{
			lpcd->dwArg0 = (DWORD)lpwsChild->hThis;
			bRetv = Sys_ImplementCallBack4( lpcd, lParam );
		}
		else  // inner call
			bRetv = ((WNDENUMPROC)lpcd->lpfn)( lpwsChild->hThis, lParam );

		//EnterCriticalSection( &csWindow );//2004-03-31, call by caller
	    
		if( bRetv == FALSE )
			break;

		if( bEnumChild && 
			lpwsChild->lpwsChild &&
			Win_IsWindow( lpwsChild->hThis ) )
		{
			bRetv = _Win_Enum( lpwsChild->lpwsChild, bEnumChild, lpcd, lParam );
		}

		if( bRetv == TRUE )
        {   // if return TRUE, contine enumerate            
            if( lpwsNext )
            {
                if( Win_IsWindow( lpwsNext->hThis ) )
                    lpwsChild = lpwsNext;
                else // retry
                    break;//lpws = hwndScreen.lpwsChild;
            }
            else
			{
                break;
			}
        }
		else
			break;
    }

	//LeaveCriticalSection( &csWindow );//2004-03-31, call by caller
    
    return bRetv;//TRUE;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static BOOL DoEnumWindow( _LPWINDATA lpwsChild, BOOL bEnumChild, CALLBACKDATA * lpcd, LPARAM lParam )
{
	BOOL bRetv = FALSE;
	if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
	{
	    bRetv = _Win_Enum( lpwsChild, bEnumChild, lpcd, lParam );
		Sys_ReleaseException();
	}
	return bRetv;
}

// **************************************************
// 声明:BOOL WINAPI _Win_EnumChildWithProcess( HWND hParent, WNDENUMPROC lpEnumFunc, LPARAM lParam, HANDLE hProcess )
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	该函数只能被内部调用
// 引用: 
//	
// ************************************************

BOOL WINAPI _Win_EnumChildWithProcess( HWND hParent, WNDENUMPROC lpEnumFunc, LPARAM lParam, HANDLE hProcess )
{
	_LPWINDATA lpws = _GetHWNDPtr( hParent );
    CALLBACKDATA cb;
	
	cb.hProcess = hProcess;
	cb.lpfn = (FARPROC)lpEnumFunc;

	//EnterCriticalSection( &csWindow );
	LockCSWindow();
	
	if( lpws == NULL )
		lpws = hwndScreen.lpwsChild;
	else
		lpws = lpws->lpwsChild;

	DoEnumWindow( lpws, TRUE, &cb, lParam );
		
	//LeaveCriticalSection( &csWindow );
	UnlockCSWindow();

	return TRUE;
}

// **************************************************
// 声明:BOOL WINAPI _Win_EnumChildInside( HWND hParent, WNDENUMPROC lpEnumFunc, LPARAM lParam )
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	该函数只能被内部调用
// 引用: 
//	
// ************************************************

BOOL WINAPI _Win_EnumChildInside( HWND hParent, WNDENUMPROC lpEnumFunc, LPARAM lParam )
{
	return _Win_EnumChildWithProcess( hParent, lpEnumFunc, lParam, NULL );
}


// **************************************************
// 声明:BOOL WINAPI Win_EnumChild( HWND hParent, WNDENUMPROC lpEnumFunc, LPARAM lParam )
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	该函数只能被系统调用,内部不能调用该函数
// 引用: 
//	
// ************************************************

BOOL WINAPI Win_EnumChild( HWND hParent, WNDENUMPROC lpEnumFunc, LPARAM lParam )
{
	return _Win_EnumChildWithProcess( hParent, lpEnumFunc, lParam, GetCallerProcess() );
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

BOOL WINAPI Win_EnumTask( HTASK hTask, WNDENUMPROC lpEnumFunc, LPARAM lParam )
{
    return TRUE;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

BOOL DoEnumTopLevelWindow( WNDENUMPROC lpProc, LPARAM lParam, HANDLE hOwnerProcess )
{
	CALLBACKDATA cd;
	BOOL bRetv;
	
	cd.hProcess = hOwnerProcess;
	cd.lpfn = (FARPROC)lpProc;
	
	//EnterCriticalSection( &csWindow );  //有可能导致死锁

	bRetv = DoEnumWindow( hwndScreen.lpwsChild, FALSE, &cd, lParam );

	//LeaveCriticalSection( &csWindow );

	return bRetv;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	该函数只能被内部调用
// 引用: 
//	
// ************************************************

BOOL WINAPI _Win_EnumInside( WNDENUMPROC lpEnumFunc, LPARAM lParam )
{
	return DoEnumTopLevelWindow( lpEnumFunc, lParam, NULL );
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	该函数只能被系统调用,内部不能调用该函数
// 引用: 
//	
// ************************************************

BOOL WINAPI Win_Enum( WNDENUMPROC lpEnumFunc, LPARAM lParam )
{
	return DoEnumTopLevelWindow( lpEnumFunc, lParam, GetCallerProcess() );
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

BOOL WINAPI Win_Flash( HWND hWnd, BOOL bInvert )
{
    return FALSE;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

struct DOFIND{
	LPCTSTR lpcClassName;
	LPCTSTR lpcWindowName;
	HWND hWnd;
};

static BOOL CALLBACK DoFind(HWND hWnd, LPARAM lParam)
{
    _LPWINDATA lpws;
	struct DOFIND * lpFind = (struct DOFIND *)lParam;

    lpws = _GetHWNDPtr( hWnd );
	if( lpFind->lpcClassName == NULL ||
		stricmp( lpws->lpClass->wc.lpszClassName, lpFind->lpcClassName ) == 0 )
	{
		if( lpFind->lpcWindowName )
		{	
			DWORD dwOldPerm = SetProcPermissions( ~0 );  //得到对进程的存取权限
			if( lpws->lpWinText &&
				stricmp( lpws->lpWinText, lpFind->lpcWindowName ) == 0 )
			{
				SetProcPermissions( dwOldPerm );  //恢复对进程的存取权限
				lpFind->hWnd = hWnd;
				return FALSE;   // stop enmu
			}
			SetProcPermissions( dwOldPerm );  //恢复对进程的存取权限
		}
		else
		{
			lpFind->hWnd = hWnd;
			return FALSE;   // stop emu
		}
	}
	return TRUE;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

HWND WINAPI Win_Find( LPCTSTR lpcClassName, LPCTSTR lpcWindowName )
{
	struct DOFIND findData;

	CALLBACKDATA cd;


	cd.hProcess = NULL;
	cd.lpfn = (FARPROC)DoFind;

	findData.hWnd = NULL;
	findData.lpcClassName = lpcClassName;
	findData.lpcWindowName = lpcWindowName;

	//EnterCriticalSection( &csWindow );
	LockCSWindow();
	
	DoEnumWindow( hwndScreen.lpwsChild, FALSE, &cd, (LPARAM)&findData );

	//LeaveCriticalSection( &csWindow );
	UnlockCSWindow();
	

	return findData.hWnd;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

BOOL WINAPI Win_GetClientRect( HWND hWnd, LPRECT lpRect )
{
    _LPWINDATA lpws;
    
	lpws = (_LPWINDATA)_GetHWNDPtr( hWnd );

    if( lpws )
    {
        lpRect->left = lpRect->top = 0;
        lpRect->right = lpws->rectClient.right - lpws->rectClient.left;
        lpRect->bottom = lpws->rectClient.bottom - lpws->rectClient.top;
        return TRUE;
    }
    return FALSE;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

HWND WINAPI Win_GetDesktop( void )
{
	return hwndScreen.hThis;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

HWND WINAPI Win_GetFocus( void )
{
	LPGWEDATA lpgwe = GetGWEPtr( GetCurrentThreadId() );

	if( lpgwe )
        return lpgwe->hwndFocus;
	return NULL;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

HWND WINAPI Win_GetParent( HWND hWnd )
{
    _LPWINDATA lpws = (_LPWINDATA)_GetHWNDPtr( hWnd );
    if( lpws )
    {
        if( lpws->lpwsParent )
		    return (lpws->lpwsParent->hThis);
    }
    return NULL;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

HWND WINAPI Win_GetNext( HWND hWnd, UINT wCmd )
{
	_LPWINDATA lpwsWndRetv = NULL;
	_LPWINDATA lpws = _GetHWNDPtr(hWnd);

	if( lpws )
	{
		//EnterCriticalSection( &csWindow );
		LockCSWindow();
		if( lpws )
		{
			if( wCmd == GW_HWNDNEXT )
				lpwsWndRetv = lpws->lpwsNext;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -