📄 win.c
字号:
else
lpwsWndRetv = lpws->lpwsPrev;
}
//LeaveCriticalSection( &csWindow );
UnlockCSWindow();
}
if( lpwsWndRetv )
return lpwsWndRetv->hThis;
return NULL;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
HWND WINAPI Win_GetTop( HWND hWnd )
{
_LPWINDATA lpws = (_LPWINDATA)_GetHWNDPtr( hWnd );
if( lpws && lpws->lpwsChild )
{
return lpws->lpwsChild->hThis;
}
return NULL;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
HWND WINAPI Win_Get( HWND hWnd, UINT uCmd )
{
_LPWINDATA lpws;
_LPWINDATA lpwsWndRetv = NULL;
//EnterCriticalSection( &csWindow );
LockCSWindow();
lpws = _GetHWNDPtr( hWnd );
if( lpws )
{
if( uCmd == GW_CHILD )
lpwsWndRetv = lpws->lpwsChild;
else if( uCmd == GW_HWNDFIRST )
{
lpwsWndRetv = GET_Z_ORDER_UP( lpws )->lpwsChild;
}
else if( uCmd == GW_HWNDLAST )
{
while( lpws->lpwsNext )
{
// if next window is exist and next window has WS_CHILD style, continue
lpws = lpws->lpwsNext;
}
lpwsWndRetv = lpws;
}
else if( uCmd == GW_HWNDNEXT )
{
lpwsWndRetv = lpws->lpwsNext;//_NextWindow( hWnd );
}
else if( uCmd == GW_HWNDPREV )
{
lpwsWndRetv = lpws->lpwsPrev;//_PrevWindow( hWnd );
}
else if( uCmd == GW_OWNER )
{
lpwsWndRetv = lpws->lpwsOwner;
}
else
{
ASSERT( 0 );
}
}
//LeaveCriticalSection( &csWindow );
UnlockCSWindow();
if( lpwsWndRetv )
return lpwsWndRetv->hThis;
return NULL;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
LONG WINAPI Win_GetLong( HWND hWnd, int nIndex )
{
_LPWINDATA lpws = _GetHWNDPtr( hWnd );
if( lpws )
{
// WNDCLASS wc;
switch( nIndex )
{
case GWL_MAINSTYLE:
return lpws->dwMainStyle;
case GWL_EXSTYLE:
return lpws->dwExStyle;
case GWL_TEXT_PTR:
return (LONG)UnMapPtr( lpws->lpWinText );
case GWL_ID:
return (LONG)lpws->hMenu;
case GWL_VSCROLL:
return (LONG)lpws->lpvScrollBar;
case GWL_HSCROLL:
return (LONG)lpws->lphScrollBar;
case GWL_HICONSM:
return (LONG)lpws->hSmallIcon;
case GWL_HICON:
return (LONG)lpws->hBigIcon;
case GWL_HWNDPARENT:
return (LONG)( lpws->lpwsParent ? lpws->lpwsParent->hThis : NULL );
case GWL_USERDATA:
return lpws->dwUserData;
case GWL_HINSTANCE:
return (LONG)lpws->hinst;
case GWL_WNDPROC:
if( lpws->lpfnWndProc == lpws->lpClass->wc.lpfnWndProc )
return -1;
else
return (LONG)(lpws->lpfnWndProc);
default:
if( lpws->lpClass == NULL )
return 0;
if( (int)( nIndex + sizeof( LONG ) ) > lpws->lpClass->wc.cbWndExtra )
return 0;
else
return _GetLong( (LPBYTE)lpws + sizeof( _WINDATA ) + nIndex );
}
}
return 0;
}
// **************************************************
// 声明:LONG WINAPI _Win_SetLong( HWND hWnd, int nIndex, LONG dwNewLong )
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
static LONG WINAPI Win_SetLongWithProcess( HWND hWnd, int nIndex, LONG dwNewLong, HANDLE hCallerProcess )
{
_LPWINDATA lpws = _GetHWNDPtr( hWnd );
if( lpws )
{
LONG oldLong = 0;
// check valid
switch( nIndex )
{
case GWL_MAINSTYLE:
{
STYLESTRUCT ss, * lpss;
if( lpws->dwMainStyle != (DWORD)dwNewLong )
{
ss.styleNew = lpws->dwExStyle;
ss.styleOld = dwNewLong;
lpss = (STYLESTRUCT*)MapPtrToProcess( &ss, hgwmeProcess );
WinMsg_Send( hWnd, WM_STYLECHANGING, GWL_STYLE, (LPARAM)lpss );
oldLong = lpws->dwMainStyle;
lpws->dwMainStyle = ss.styleOld;
WinMsg_Send( hWnd, WM_STYLECHANGED, GWL_STYLE, (LPARAM)lpss );
if( (oldLong & 0xffff0000) != (lpws->dwMainStyle & 0xffff0000) )
Win_SetPos( hWnd, NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |SWP_NOACTIVATE | SWP_FRAMECHANGED );
}
else
oldLong = lpws->dwMainStyle;
}
break;
case GWL_VSCROLL:
oldLong = (LONG)lpws->lpvScrollBar;
lpws->lpvScrollBar = (LPVOID)dwNewLong;
break;
case GWL_HSCROLL:
oldLong = (LONG)lpws->lphScrollBar;
lpws->lphScrollBar = (LPVOID)dwNewLong;
break;
case GWL_USERDATA:
oldLong = lpws->dwUserData;
lpws->dwUserData = dwNewLong;
break;
case GWL_ID:
oldLong = (long)lpws->hMenu;
lpws->hMenu = (HMENU)dwNewLong;
break;
case GWL_EXSTYLE:
{
STYLESTRUCT ss, *lpss;
if( lpws->dwExStyle != (DWORD)dwNewLong )
{
ss.styleNew = dwNewLong;
ss.styleOld = lpws->dwMainStyle;
lpss = (STYLESTRUCT*)MapPtrToProcess( &ss, hgwmeProcess );
WinMsg_Send( hWnd, WM_STYLECHANGING, GWL_EXSTYLE, (LPARAM)lpss );
oldLong = lpws->dwExStyle;
lpws->dwExStyle = ss.styleNew;
WinMsg_Send( hWnd, WM_STYLECHANGED, GWL_EXSTYLE, (LPARAM)lpss );
if( (DWORD)oldLong != lpws->dwExStyle )
Win_SetPos( hWnd, NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |SWP_NOACTIVATE | SWP_FRAMECHANGED );
}
else
oldLong = lpws->dwExStyle;
}
break;
case GWL_TEXT_PTR:
if( hCallerProcess == lpws->hOwnerProcess )
{
oldLong = (LONG)UnMapPtr( lpws->lpWinText );
lpws->lpWinText = MapPtrToProcess( (LPVOID)dwNewLong, hCallerProcess );
}
else
{
ASSERT( 0 );
}
break;
case GWL_HICONSM:
oldLong = (LONG)lpws->hSmallIcon;
lpws->hSmallIcon = (HICON)dwNewLong;
break;
case GWL_HICON:
oldLong = (LONG)lpws->hBigIcon;
lpws->hBigIcon = (HICON)dwNewLong;
break;
case GWL_WNDPROC:
if( lpws->hOwnerProcess == hCallerProcess ||
hCallerProcess == hgwmeProcess //2004-10-13 必定是内部的调用,否则就是错的
)
//2004-10-13-end
{
oldLong = (LONG)(lpws->lpfnWndProc);
// EnterCS ???? same thread ????
if( dwNewLong == -1 ) // LN, 2003.05.30
{
lpws->uState &= ~WINS_INUSERPROC;// LN, 2003.05.30
dwNewLong = (LONG)lpws->lpClass->wc.lpfnWndProc;
}
else
lpws->uState |= WINS_INUSERPROC;// LN, 2003.05.30
lpws->lpfnWndProc = (WNDPROC)dwNewLong;
//LeaveCS
}
//else if( hCallerProcess == hgwmeProcess )
//{
//}
break;
case GWL_HINSTANCE:
oldLong = (LONG)lpws->hinst;
lpws->hinst = (HINSTANCE)dwNewLong;
break;
default:
if( lpws->lpClass == NULL )
return 0;
if( (int)(nIndex + sizeof( LONG )) > (int)(lpws->lpClass->wc.cbWndExtra) )
return 0;
else
{
oldLong = _GetLong( (LPBYTE)lpws + sizeof( _WINDATA ) + nIndex );
_SetLong( (LPBYTE)lpws + sizeof( _WINDATA ) + nIndex, dwNewLong );
}
}
return oldLong;
}
return 0;
}
// **************************************************
// 声明:LONG WINAPI Win_SetLongInside( HWND hWnd, int nIndex, LONG dwNewLong )
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
// 内部调用
// 引用:
//
// ************************************************
LONG WINAPI Win_SetLongInside( HWND hWnd, int nIndex, LONG dwNewLong )
{
return Win_SetLongWithProcess( hWnd, nIndex, dwNewLong, hgwmeProcess );
}
// **************************************************
// 声明:LONG WINAPI Win_SetLongInside( HWND hWnd, int nIndex, LONG dwNewLong )
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
// 系统调用
// 引用:
//
// ************************************************
LONG WINAPI Win_SetLong( HWND hWnd, int nIndex, LONG dwNewLong )
{
return Win_SetLongWithProcess( hWnd, nIndex, dwNewLong, GetCallerProcess() );
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
BOOL WINAPI Win_GetWindowRect( HWND hWnd, LPRECT lpRect )
{
_LPWINDATA lpws = _GetHWNDPtr( hWnd );
if( lpws )
{
*lpRect = lpws->rectWindow;
return TRUE;
}
return FALSE;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
int WINAPI Win_GetText( HWND hWnd, LPSTR lpstr, int nMaxCount )
{
_LPWINDATA lpws = _GetHWNDPtr( hWnd );
int retv = 0;
*lpstr = 0;
if( lpws )
{
if( lpws->hOwnerProcess == GetCallerProcess() )
{
WinMsg_SendTimeout( hWnd, WM_GETTEXT, nMaxCount, (LPARAM)lpstr, SMTO_BLOCK, 5000, &retv );
}
else if( lpws->lpWinText )
{
DWORD dwOldPerm;
dwOldPerm = SetProcPermissions( ~0 ); //得到对进程的存取权限
strncpy( lpstr, lpws->lpWinText, nMaxCount );
retv = strlen( lpstr );
SetProcPermissions( dwOldPerm ); //恢复对进程的存取权限
}
}
return retv;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
int WINAPI Win_GetTextLength( HWND hWnd )
{
return (int)WinMsg_Send( hWnd, WM_GETTEXTLENGTH, 0, 0 );
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
BOOL _AddPaintRegion( HRGN hrgnUpdate )
{
extern int CALLBACK __PutPaintRgn( HRGN hrgn );
__PutPaintRgn( hrgnUpdate );
return TRUE;
}
// **************************************************
// 声明:
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//
// 引用:
//
// ************************************************
void _AddPaintWndRgn( _LPWINDATA lpws, HRGN hrgnUpdate, BOOL fUpdateChild, DWORD uiThreadID )
{
HRGN hrgn;
int retv;
if( lpws && !(lpws->dwMainStyle & WS_CHILD) )
{
HRGN hsys;
if( lpws->dwThreadID == uiThreadID )
{
int xOffset = lpws->rectWindow.left;
int yOffset = lpws
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -