相关函数如下:
GetDesktopWindow()
GetWindowRect()
GetDC()
CreateCompatibleDC()
CreateCompatibleBitmap()
SelectObject()
BitBlt()
DeleteDC()
ReleaseDC()
函数说明:
GetDesktopWindow 函数 该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。
定义
HWND GetDesktopWindow(VOID);
返回值
返回值为桌面窗口的句柄。
GetWindowRect 函数 得到的是在屏幕坐标系下的RECT(即以屏幕左上角为原点)
定义
BOOL GetWindowRect(
HWND hWnd, // 想获得范围矩形的那个窗口的句柄
LPRECT lpRect // 屏幕坐标中随同窗口装载的矩形
);
返回值
布尔值
使用的相关结构:
typedef struct tagRECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT
left和top字段描叙了矩形第一个角(通常是左上角),right和bottom字段描叙了矩形的第二个角(通常是右下角)。
这两个位置决定了矩形的大小与位置。这些字段采用的单位及坐标系统取决于当前的有效缩放比例、准备表示的对象以及准备调用的api函数。
并不要求bottom字段的绝对值大于top字段,而且也可以为负数。
GetDC 函数 获取指定窗口的设备场景
定义
HDC GetDC(
HWND hWnd // 将获取其设备场景的窗口的句柄。若为0,则要获取整个屏幕的DC
);
返回值
指定窗口的设备场景句柄
用本函数获取的设备场景一定要用ReleaseDC函数释放,不能用DeleteDC
CreateCompatibleDC 函数 创建一个与特定设备场景一致的内存设备场景
定义
HDC CreateCompatibleDC(
HDC hdc // 设备场景句柄。新的设备场景将与它一致。也可能为0以创建一个与屏幕一致的设备场景
);
返回值
新设备场景句柄
CreateCompatibleBitmap 函数 创建一幅与设备有关位图,它与指定的设备场景兼容
定义
HBITMAP CreateCompatibleBitmap(
HDC hdc, // 设备场景的句柄
int nWidth, // 位图宽度,以像素为单位
int nHeight // 位图高度,以像素为单位
);
返回值
执行成功返回位图句柄,零表示失败
一旦位图不再需要,一定用DeleteObject函数释放它占用的内存及资源
SelectObject 函数 每个设备场景都可能有选入其中的图形对象。其中包括位图、刷子、字体、画笔以及区域等等。
一次选入设备场景的只能有一个对象。选定的对象会在设备场景的绘图操作中使用。
例如,当前选定的画笔决定了在设备场景中描绘的线段颜色及样式
定义
HGDIOBJ SelectObject(
HDC hdc, // 一个设备场景的句柄
HGDIOBJ hgdiobj // 一个画笔、位图、刷子、字体或区域的句柄
);
返回值
与以前选入设备场景的相同HGDIOBJ类型的一个对象的句柄,零表示出错。如选定的对象是一个区域(Region),
结果就是下列常数之一:SIMPLEREGION, COMPLEXREGION 或 NULLREGION 对区域进行描述, GDI_ERROR 表示出错
返回值通常用于获得选入DC的对象的原始值。绘图操作完成后,原始的对象通常选回设备场景。
在清除一个设备场景前,务必注意恢复原始的对象
BitBlt 函数 将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容
定义
BOOL BitBlt(
HDC hdcDest, // 目标设备场景
int nXDest, // 对目标DC中目标矩形左上角位置进行描述的那个X点。用目标DC的逻辑坐标表示
int nYDest, // 对目标DC中目标矩形左上角位置进行描述的那个Y点。用目标DC的逻辑坐标表示
int nWidth, // 欲传输图象的宽度
int nHeight, // 欲传输图象的高度
HDC hdcSrc, // 源设备场景。如光栅运算未指定源,则应设为0
int nXSrc, // 对源DC中源矩形左上角位置进行描述的那X点。用源DC的逻辑坐标表示
int nYSrc, // 对源DC中源矩形左上角位置进行描述的那Y点。用源DC的逻辑坐标表示
DWORD dwRop // 传输过程要执行的光栅运算
);
dwRop BLACKNESS CAPTUREBLT DSTINVERT MERGECOPY MERGEPAINT NOMIRRORBITMAP NOTSRCCOPY NOTSRCERASE PATCOPY PATINVERT
PATPAINT SRCAND SRCCOPY SRCERASE SRCINVERT SRCPAINT WHITENESS
这些光栅运算 请查看MSDN
返回值
非零表示成功,零表示失败。
在NT环境下,如在一次世界传输中要求在源设备场景中进行剪切或旋转处理,这个函数的执行会失败
如目标和源DC的映射关系要求矩形中像素的大小必须在传输过程中改变,
那么这个函数会根据需要自动伸缩、旋转、折叠、或切断,以便完成最终的传输过程
DeleteDC 函数 删除专用设备场景或信息场景,释放所有相关窗口资源。不要将它用于GetDC函数取回的设备场景
定义
BOOL DeleteDC(
HDC hdc // 将要删除的设备场景
);
返回值
执行成功则为非零,失败则为零
若有对象被选入设备场景,则在调用本函数前应将它们选出。为此,可将初始对象回选入DC,
也可用SaveDC, RestoreDC函数对回复DC为其创建时的状态
ReleaseDC 函数 释放由调用GetDC或GetWindowDC函数获取的指定设备场景。它对类或私有设备场景无效(但这样的调用不会造成损害)
定义
int ReleaseDC(
HWND hWnd, // 要释放的设备场景相关的窗口句柄
HDC hDC // 要释放的设备场景句柄
);
返回值
执行成功为1,否则为0
对那些用CreateDC一类的DC创建函数生成的设备场景,不要用本函数
typedef struct tagSIZE {
LONG cx; //规定矩形的宽度.单位依靠哪个功能使用这
LONG cy; //规定矩形的高度.单位依靠哪个功能使用这.
} SIZE, *PSIZE;
矩形维贮藏在这结构可能相应视点广度, 窗口广度, 文本广度, 位图维, 或样子-比过滤器为了一些伸出的功能
代码的实现
#define WINVER 0x0500
#include
BOOL m_bFullScreen; //全屏幕显示标志
RECT m_FullScreenWindowRect; //全屏幕显示窗口Rect
WINDOWPLACEMENT m_wpPrev; //用于保存正常视图时的窗口位置信息
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
void fff(HWND hWnd);
HCURSOR bitHidh();
HBITMAP hBitmap ;
SIZE screensize;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("catch") ;
HWND hWnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hWnd = CreateWindow (szAppName, TEXT ("屏幕录象与视频录象的开发"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT,
800, 600,
NULL, NULL, hInstance, NULL) ;
HDC hdc = GetDC(NULL);
RECT rect;
::GetWindowRect(::GetDesktopWindow(),&rect);
screensize.cx=rect.right-rect.left;
screensize.cy=rect.bottom-rect.top;
hBitmap = ::CreateCompatibleBitmap(hdc ,screensize.cx,screensize.cy);
fff(hWnd);
ShowWindow (hWnd, iCmdShow) ;
UpdateWindow (hWnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth ;
HDC hdc ;
int i, x, y, iVertPos, iHorzPos, iPaintBeg, iPaintEnd ;
PAINTSTRUCT ps ;
SCROLLINFO si ;
TCHAR szBuffer[10] ;
HDC MemDC;
switch (message)
{
case WM_RBUTTONDOWN:
ShowWindow(hWnd,SW_HIDE);
Sleep(1000);
fff(hWnd);
ShowWindow(hWnd,SW_SHOWNORMAL);
case WM_LBUTTONDOWN:
RECT rectDesktop;
WINDOWPLACEMENT wpNew;
if(m_bFullScreen)
{
GetWindowPlacement(hWnd,&m_wpPrev);
m_wpPrev.length = sizeof (m_wpPrev);
::GetWindowRect(::GetDesktopWindow(),&rectDesktop);
wpNew = m_wpPrev;
wpNew.showCmd = SW_SHOWNORMAL;
wpNew.rcNormalPosition = rectDesktop;
SetWindowLong( hWnd, GWL_STYLE, WS_BORDER );
SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, rectDesktop.right, rectDesktop.bottom, SWP_SHOWWINDOW);
m_bFullScreen = FALSE;
}
else
{
m_bFullScreen=TRUE;
SetWindowLong( hWnd, GWL_STYLE,WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL);
ShowWindow(hWnd,SW_SHOWNORMAL);
wpNew = m_wpPrev;
}
SetWindowPlacement(hWnd, &wpNew);
return 0 ;
case WM_CREATE:
m_bFullScreen = FALSE ;
iMaxWidth = screensize.cx;
return 0 ;
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
si.cbSize = sizeof (si) ;
si.fMask = SIF_RANGE | SIF_PAGE ;
si.nMin = 0 ;
si.nMax = screensize.cy - 1 ;
si.nPage = cyClient + 54 ;
SetScrollInfo (hWnd, SB_VERT, &si, TRUE) ;
// Set horizontal scroll bar range and page size
si.cbSize = sizeof (si) ;
si.fMask = SIF_RANGE | SIF_PAGE ;
si.nMin = 0 ;
si.nMax = screensize.cx - 1;
si.nPage = cxClient + 8 ;
SetScrollInfo (hWnd, SB_HORZ, &si, TRUE) ;
return 0 ;
case WM_VSCROLL:
// Get all the vertial scroll bar information
si.cbSize = sizeof (si) ;
si.fMask = SIF_ALL ;
GetScrollInfo (hWnd, SB_VERT, &si) ;
// Save the position for comparison later on
iVertPos = si.nPos ;
switch (LOWORD (wParam))
{
case SB_TOP:
si.nPos = si.nMin ;
break ;
case SB_BOTTOM:
si.nPos = si.nMax ;
break ;
case SB_LINEUP:
si.nPos -= 1 ;
break ;
case SB_LINEDOWN:
si.nPos += 1 ;
break ;
case SB_PAGEUP:
si.nPos -= si.nPage ;
break ;
case SB_PAGEDOWN:
si.nPos += si.nPage ;
break ;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos ;
break ;
default:
break ;
}
// Set the position and then retrieve it. Due to adjustments
// by Windows it may not be the same as the value set.
si.fMask = SIF_POS ;
SetScrollInfo (hWnd, SB_VERT, &si, TRUE) ;
GetScrollInfo (hWnd, SB_VERT, &si) ;
// If the position has changed, scroll the window and update it
if (si.nPos != iVertPos)
{
ScrollWindow (hWnd, 0, screensize.cx * (iVertPos - si.nPos),
NULL, NULL) ;
UpdateWindow (hWnd) ;
}
return 0 ;
case WM_HSCROLL:
// Get all the vertial scroll bar information
si.cbSize = sizeof (si) ;
si.fMask = SIF_ALL ;
// Save the position for comparison later on
GetScrollInfo (hWnd, SB_HORZ, &si) ;
iHorzPos = si.nPos ;
switch (LOWORD (wParam))
{
case SB_LINELEFT:
si.nPos -= 1 ;
break ;
case SB_LINERIGHT:
si.nPos += 1 ;
break ;
case SB_PAGELEFT:
si.nPos -= si.nPage ;
break ;
case SB_PAGERIGHT:
si.nPos += si.nPage ;
break ;
case SB_THUMBPOSITION:
si.nPos = si.nTrackPos ;
break ;
default :
break ;
}
// Set the position and then retrieve it. Due to adjustments
// by Windows it may not be the same as the value set.
si.fMask = SIF_POS ;
SetScrollInfo (hWnd, SB_HORZ, &si, TRUE) ;
GetScrollInfo (hWnd, SB_HORZ, &si) ;
// If the position has changed, scroll the window
if (si.nPos != iHorzPos)
{
ScrollWindow (hWnd, screensize.cy * (iHorzPos - si.nPos), 0,
NULL, NULL) ;
}
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hWnd, &ps) ;
si.cbSize = sizeof (si) ;
si.fMask = SIF_POS ;
GetScrollInfo (hWnd, SB_VERT, &si) ;
iVertPos = si.nPos ;
GetScrollInfo (hWnd, SB_HORZ, &si) ;
iHorzPos = si.nPos ;
x = screensize.cx - iHorzPos ;
y = screensize.cy - iVertPos ;
MemDC = ::CreateCompatibleDC(hdc);
::SelectObject(MemDC,hBitmap);
::BitBlt(hdc,0,0,x,y,MemDC,screensize.cx - x,screensize.cy - y,SRCCOPY);
::DeleteObject(MemDC);
EndPaint (hWnd, &ps) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hWnd, message, wParam, lParam) ;
}
void fff(HWND hWnd)
{
HWND hwnd = ::GetDesktopWindow();//获得屏幕的HWND.
RECT rect;
::GetWindowRect(hwnd,&rect);
HDC hScreenDC = ::GetDC(NULL); //获得屏幕的HDC.
HDC hDC = ::GetDC(hWnd);
HDC MemDC = ::CreateCompatibleDC(hScreenDC);
screensize.cx=rect.right-rect.left;
screensize.cy=rect.bottom-rect.top;
HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);
DWORD bltFlags = SRCCOPY;
bltFlags |= CAPTUREBLT;
::BitBlt(MemDC,0,0,screensize.cx,screensize.cy,hScreenDC,rect.left,rect.top,bltFlags);
POINT xPoint;
GetCursorPos( &xPoint );
HCURSOR hcur= bitHidh();
xPoint.x-=rect.left;
xPoint.y-=rect.top;
CURSORINFO vCurosrInfo;
vCurosrInfo.cbSize = sizeof(CURSORINFO);
GetCursorInfo( &vCurosrInfo);
::DrawIcon( MemDC, xPoint.x, xPoint.y, hcur);
//::SelectObject(MemDC,hOldBMP);
::DeleteObject(MemDC);
::ReleaseDC(hWnd,hScreenDC);
}
HCURSOR bitHidh()
{
POINT xPoint;
HCURSOR hcur;
GetCursorPos( &xPoint );
HWND rsul = ::WindowFromPoint(xPoint);
DWORD mID = GetWindowThreadProcessId(rsul, NULL);
DWORD mTID = GetCurrentThreadId();
if(mID != mTID)
{
hcur = GetCursor();
if(AttachThreadInput(mID,mTID,TRUE))
{
hcur = GetCursor();
AttachThreadInput(mID,mTID,FALSE);
}
}
else
{
hcur = GetCursor();
}
return hcur;
}
http://www.joysoft.cn/thread-37-1-1.html
http://www.joysoft.cn/redirect.php?fid=11&tid=37&goto=nextnewset