我写了一个截屏的程序,修改注册表自动运行,程序是自动运行了可和点击运行效果不一样

z752964360 2010-03-18 03:25:58
这个程序是一个console 程序,启动后在后台运行。
通过在“Time_to_Shot.txt”中读取时间间隔来隔一段时间截屏。
运行时自动修改注册表,使之开机自动运行,开机自动运行实现了,但不截屏,如果是点击运行的话很正常!!

不知道什么原因!求救!
...全文
198 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sun125926 2012-08-29
  • 打赏
  • 举报
回复
大侠,我想请问,我改写了注册表,为什么开机不自动运行呢!!程序都对,期待您的回复
z752964360 2010-06-30
  • 打赏
  • 举报
回复
代码都贴上面了,没有用
这不是鸭头 2010-03-19
  • 打赏
  • 举报
回复
是不是使用了GetCurrentDirectory函数..?
CSharp_XinBing1 2010-03-19
  • 打赏
  • 举报
回复
mark
mark
z752964360 2010-03-19
  • 打赏
  • 举报
回复
占CPU多的原因是,计算机重启后程序从C:\Documents and Settings\Administrator读不到“Time_to_Shot.txt”里的程序间隔,一直在截图!!
z752964360 2010-03-19
  • 打赏
  • 举报
回复
兄弟们,我找到原因了!
刚才搜索终于把截得图搜索出来了!原来都存到C:\Documents and Settings\Administrator里了!!汗2G了
点击运行我存文件用的是默认目录,每次重启电脑后程序实际运行了,而我还是去老目录里找!!所以没发现!
WizardK 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cpp2017 的回复:]

加点调试信息,看是屏幕没有截到内容还是你的方法根本没有运行,

或者是你的启动目录不对,把图片保存到其他地方去了。
[/Quote]

UP,需要更多的信息
z752964360 2010-03-18
  • 打赏
  • 举报
回复
点击运行,截图正常,而且CPU使用的很少0%-2%
但是开机自动运行的话,占得34%很高
z752964360 2010-03-18
  • 打赏
  • 举报
回复
用到的两个函数:
HBITMAP GetDcBitmap(HDC hDC,DWORD dwWidth, DWORD dwHeight)
{
HDC hMemDC;
HBITMAP hBitmap, hBitTemp;
hMemDC = CreateCompatibleDC(hDC);
hBitmap = CreateCompatibleBitmap(hDC, dwWidth, dwHeight);
hBitTemp = (HBITMAP) SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, dwWidth, dwHeight, hDC, 0, 0, SRCCOPY);
hBitmap = (HBITMAP) SelectObject(hMemDC, hBitTemp);
DeleteObject(hBitTemp);
::DeleteDC(hMemDC);
return hBitmap;
}

int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄
{ //lpFileName 为位图文件名
HDC hDC;
//设备描述表
int iBits;
//当前显示分辨率下每个像素所占字节数
WORD wBitCount;
//位图中每个像素所占字节数
//定义调色板大小, 位图中像素字节大小 ,
//位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0,
dwBmBitsSize,
dwDIBSize, dwWritten;
BITMAP Bitmap;
//位图属性结构
BITMAPFILEHEADER bmfHdr;
//位图文件头结构
BITMAPINFOHEADER bi;
//位图信息头结构
LPBITMAPINFOHEADER lpbi;
//指向位图信息头结构
HANDLE fh, hDib, hPal,hOldPal=NULL;
//定义文件,分配内存句柄,调色板句柄

//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC,BITSPIXEL) * GetDeviceCaps(hDC,PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;
else
wBitCount = 32;
//计算调色板大小
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);

//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+
dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);


*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if(hPal)
{
hDC = GetDC(NULL);
hOldPal = SelectPalette(hDC, (HPALETTE__ *)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize,
(tagBITMAPINFO *)lpbi, DIB_RGB_COLORS);
//恢复调色板
if(hOldPal)
{
SelectPalette(hDC, ( HPALETTE__ *)hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);
}
//创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE,0, NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return FALSE;
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)
+ dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER)
+ dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
}
cpp2017 2010-03-18
  • 打赏
  • 举报
回复
加点调试信息,看是屏幕没有截到内容还是你的方法根本没有运行,

或者是你的启动目录不对,把图片保存到其他地方去了。
yxwsbobo 2010-03-18
  • 打赏
  • 举报
回复
我怀疑开机自动运行的时候 有些DLL或依赖文件没有初始化好
z752964360 2010-03-18
  • 打赏
  • 举报
回复
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
//修改注册表,使开机运行
HKEY hKey;

char path[MAX_PATH];

GetModuleFileName(NULL,path,sizeof(path));
RegCreateKey(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&hKey);

RegSetValueEx(hKey,"ShotScreen",0,REG_SZ,(CONST BYTE*)path,
sizeof(path));
RegCloseKey(hKey);
//获取窗口句柄,屏幕分辨率


HWND hwnd = GetDesktopWindow();
int cxScreen,cyScreen;
cxScreen = GetSystemMetrics(SM_CXFULLSCREEN);
cyScreen = GetSystemMetrics(SM_CYFULLSCREEN);

//获取"Time_to_Shot.txt"中保存的截屏时间间隔
HANDLE hFile = CreateFile("Time_to_Shot.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
char ch[10];
DWORD dwReads;
ReadFile(hFile,ch,10,&dwReads,NULL);
ch[dwReads] = 0;
CloseHandle(hFile);

//开始循环截屏

int ShotSpan = atoi(ch);
while(1)
{
CTime t = CTime::GetCurrentTime();
Sleep((DWORD)ShotSpan*1000);

CString s = t.Format( "%Y, %B %d,%A,%H,%M,%S" );
s+=".bmp";
HBITMAP hBmp = GetDcBitmap(GetDC(NULL),cxScreen, cyScreen);
SaveBitmapToFile(hBmp,(char*)(LPCTSTR)s);
}

return 0;
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧