社区
界面
帖子详情
我写了一个截屏的程序,修改注册表自动运行,程序是自动运行了可和点击运行效果不一样
z752964360
2010-03-18 03:25:58
这个程序是一个console 程序,启动后在后台运行。
通过在“Time_to_Shot.txt”中读取时间间隔来隔一段时间截屏。
运行时自动修改注册表,使之开机自动运行,开机自动运行实现了,但不截屏,如果是点击运行的话很正常!!
不知道什么原因!求救!
...全文
198
12
打赏
收藏
我写了一个截屏的程序,修改注册表自动运行,程序是自动运行了可和点击运行效果不一样
这个程序是一个console 程序,启动后在后台运行。 通过在“Time_to_Shot.txt”中读取时间间隔来隔一段时间截屏。 运行时自动修改注册表,使之开机自动运行,开机自动运行实现了,但不截屏,如果是点击运行的话很正常!! 不知道什么原因!求救!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;
}
vc++ 应用源码包_1
另外有只打开
一个
应用
程序
、CRichEdit的使用、最小到托盘、
自动
检测在线用户(多播组)等。 freeeim_FreeEIM_企业即时通讯软件源代码2010年8月份最新版 FTP、HTTP 多线程断点续传下载文件 源码 gdiplus应用实例 ...
c#进程守护软件-附源码
4、配置文件中新增jgtime为循环时间,所有
程序
使用相同的循环时间,配置时可以配置成不一样的,实际没有意义,因只调用了
一个
定时器,但默认显示并使用最大的那个时间。 5、增加托盘图标提示及菜单 6、取消任务栏...
[含文档+源码等]微信小
程序
教学管理系统+后台管理系统[包
运行
成功]
项目名称 微信小
程序
教学管理系统+后台管理系统视频
效果
系统说明 根据对系统的需求分析,本系统将分为4个模块: 学生管理: 管理学生的基本信息,包括个人信息的添加、
修改
、删除,以及选课信息的添加。 科目管理:...
vc++ 应用源码包_2
另外有只打开
一个
应用
程序
、CRichEdit的使用、最小到托盘、
自动
检测在线用户(多播组)等。 freeeim_FreeEIM_企业即时通讯软件源代码2010年8月份最新版 FTP、HTTP 多线程断点续传下载文件 源码 gdiplus应用实例 ...
vc++ 应用源码包_6
另外有只打开
一个
应用
程序
、CRichEdit的使用、最小到托盘、
自动
检测在线用户(多播组)等。 freeeim_FreeEIM_企业即时通讯软件源代码2010年8月份最新版 FTP、HTTP 多线程断点续传下载文件 源码 gdiplus应用实例 ...
界面
15,979
社区成员
115,896
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章