Windows系统,有一个软件需要实时刷新才能收到信息,如果没有刷新,收不到信息。所以我需要一个能实现能隔2分钟刷新一下,如果有新信息来就截图自动保存下来的软件。有没有推荐的,谢谢了
思路:MFC程序。。。。。1、获得屏幕HWND 2、获得屏幕HDC 3、创建HDC句柄 4、取得屏幕矩形 5、创建匹配的bitmap 6、设置实体 7‘bitblt函数画一下 记得要删除临时的HDC 还有Bitmap 确实是用SetTimer定时截取。这是部分程序 你改吧改吧应该可用
void CServerMyFaTuDlg::CapSreen()
{
HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND.
HDC hScreenDC = ::GetDC(hWnd); //获得屏幕的HDC.
HDC MemDC = ::CreateCompatibleDC(hScreenDC);
RECT rect;
::GetWindowRect(hWnd, &rect);
SIZE screensize;
screensize.cx = rect.right - rect.left;
screensize.cy = rect.bottom - rect.top;
hBitmap = ::CreateCompatibleBitmap(hScreenDC, screensize.cx, screensize.cy);
HGDIOBJ hOldBMP = ::SelectObject(MemDC, hBitmap);
::BitBlt(MemDC, 0, 0, screensize.cx, screensize.cy, hScreenDC, rect.left, rect.top, SRCCOPY);
::SelectObject(MemDC, hOldBMP);
::DeleteObject(hOldBMP);
::ReleaseDC(hWnd, MemDC);
::DeleteObject(MemDC);
::DeleteDC(MemDC);
::ReleaseDC(hWnd, hScreenDC);
::DeleteDC(hScreenDC);
}
我做了个带界面的exe 需要vs2013的环境
运行起来是这样
我又添加了些程序:把鼠标移动到屏幕右上角 点击鼠标左键 按F5刷新桌面 这是整个线程的程序
```c++
DWORD WINAPI CServerMyFaTuDlg::Thread_CapScreenSave(LPVOID pthread)
{
CServerMyFaTuDlg* dlg = (CServerMyFaTuDlg*)pthread;
int iIng = dlg->GetDlgItemInt(IDC_EDIT3);
dlg->SetTimer(0, iIng * 1000, NULL);
CString strFilePath;
dlg->GetDlgItemTextW(IDC_EDIT4, strFilePath);
dlg->GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
// 记录时间
CTime tm = CTime::GetCurrentTime();
CString strDateTime;
CString strFinnal;
while (dlg->abstate.load(std::memory_order_acquire)==TRUE)
{
tm = CTime::GetCurrentTime();
strDateTime = tm.Format(L"%Y%m%d%H%M%S");
HDC hdc = ::GetDC(NULL);
int iWidth = GetSystemMetrics(SM_CXSCREEN); //获取屏幕水平分辨率
int iHeight = GetSystemMetrics(SM_CYSCREEN); //获取屏幕垂直分辨率
SetCursorPos(iWidth, 0);//设置鼠标位置
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//左键按下
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//左键弹起
Sleep(10);
//通过F5,刷新桌面
HWND hWndProgram = ::FindWindow(_T("Progman"), NULL);
HWND hWndDefView = ::FindWindowEx(hWndProgram, NULL, _T("SHELLDLL_DefView"), NULL);
HWND hWndListView = ::FindWindowEx(hWndDefView, NULL, _T("SysListView32"), NULL);
::PostMessage(hWndListView, WM_KEYDOWN, VK_F5, 0);
::PostMessage(hWndListView, WM_KEYUP, VK_F5, 0);
// 截图
dlg->CapSreen();
strFinnal = strFilePath + L"\\桌面截图" + strDateTime + L".bmp";
if (!dlg->SaveBitmapToFile(dlg->hBitmap, strFinnal))
{
dlg->PostMessage(WM_COMMAND, MAKEWPARAM(IDC_BUTTON1, BN_CLICKED), NULL);
}
WaitForSingleObject(dlg->hEvent, INFINITE);
}
return 0;
}
```
你要保证电脑没有开游戏,浏览器什么的,右上角要留出来可以点击鼠标的位置哦。
这是这个工程的源码链接,只能这样了 ┑(~▽ ~)┍
https://download.csdn.net/download/weixin_41376117/29638132
1.写一个VBS,什么编译,安装软件通通不用,执行就能刷新,
2.你这个软件也是奇葩,为什么要用户自己刷新才能更新消息,用户体验感极差。反人类呀
你这个所谓的软件,应该是像QQ、网易云音乐之类的软件吧,没有操作接口,要实现实时刷新,必须模仿人类的操作。
有两种方法:
1.用按键精灵,自己制定好刷新和截图的脚本。
优点是,按键精灵是现成的软件,不用自己从头开始写程序。
缺点是,仅仅限于按键精灵提供的功能,你不能临时加一些自己的想法
比如,截图时,如果发现图片没改变,也就是没有新消息,就删掉这图片。这些想法,你是没办法实时处理的。必须在按键精灵使用完后再另行处理。
2.用sikuli。
优点是,想实现什么功能就实现什么功能。比如我让它自动点刷新,然后截个图,再将这张图扔到百度文字识别解析,收集到最新消息,再来判断是否有最新消息,如果是旧消息,自动删掉这张图。或者有消息来时,我可以设置一下回复内容。
缺点是,要从头开始写程序。程序其实也不难,都封装好了。
按键精灵仅限于代替全手动的操作——鼠标点击、按键、快捷键实现截图。
如果你的操作过程既要包含手动操作部分,也要同步包含程序计算、处理等过程,那就只能用sikuli。
SetTimer
FastStone capture这个软件,有个计划任务,可以定时截图。
可以用按键精灵写个脚本,每隔两分钟点击刷新,然后如果刷新出了新消息,就截图
1、什么软件
2、刷新什么?刷新这个软件还是刷新 window 桌面,如果是刷新软件的话,需要知道刷软件的操作
3、怎么样才叫有新消息,是 window 提醒还是软件存在 新消息标识
4、如果是刷软件的话请提供软件安装包和操作说明
5、如果是window 桌面的话请提供新消息标识
6、确定好之后可以采纳我,我可以提供脚本服务
以下代码,运行结果为:
定时运行xxx程序(程序名路径需人为输入在txt文档)X秒后截图,退出程序,间隔Y秒后,再运行程序截图。循环运行
X+Y=120秒。截图文件保存在程序文件所放置路径,以日期时间命名。
(本地试验运行测试有道词典,网易云音乐,截图OK)。
import time,os
import win32con,win32gui
from win32api import WinExec
import ctypes
from PIL import ImageGrab
user32=ctypes.windll.user32
class sss():
t=20
classname=''
title=''
HWND=0
left=0
top=0
right=0
bottom=0
lenth=0
high=0
def __init__(self,exe_Path="",t=20,nowpath="D:\\"):
'''
Parameters
----------
exe_Path : 软件启动exe路径,格式如"C:\Program Files (x86)\Chroma\Chroma Solar Array Simulation Soft Panel.exe"
Returns
-------
None.
'''
self.exe_Path=exe_Path
self.t=t
self.nowpath=nowpath
def PV_Start(self):
WinExec(self.exe_Path,1)
time.sleep(self.t)
self.title = win32gui.GetWindowText (win32gui.GetForegroundWindow())
inittime=time.time()
while time.time() - inittime<60:
hwnd = user32.GetForegroundWindow()
self.HWND=hwnd
try:
win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
#win32gui.SetForegroundWindow(hwnd)
win32gui.SetWindowPos(hwnd, win32con.HWND_TOP, 0,0,0,0, win32con.SWP_NOMOVE | win32con.SWP_SHOWWINDOW| win32con.SWP_NOSIZE | win32con.SWP_NOOWNERZORDER)
self.left, self.top, self.right, self.bottom = win32gui.GetWindowRect(hwnd) # 获取窗口边界
break
except Exception :
pass
def PV_Kill(self):
if self.HWND!=0:
ba,exename=os.path.split(self.exe_Path)
os.system("taskkill /F /IM "+exename)
def capture(self):
self.PV_Start()
if self.HWND!=0:
bbox = (self.left, self.top, self.right, self.bottom)
im = ImageGrab.grab(bbox)
im.save(nowpath+"\\" + time.strftime('%Y.%m.%d %H:%M:%S', time.localtime(time.time())).replace(":",".")+ ".jpg")
time.sleep(0.3)
self.PV_Kill()
if __name__=="__main__" :
nowpath=os.getcwd()
with open(nowpath+"\\parameters.txt",'r') as f:
for linedata in f:
if linedata.find('SoftwareNamePath=')!=-1:
paths=linedata.replace("\n","").split("=")[1]
elif linedata.find('SoftwareStartTime')!=-1:
ti=int(linedata.replace("\n","").split("=")[1])
a=sss(paths,ti,nowpath)
t0=time.time()
i=0
while True:
if time.time()- t0 > i*120:
i+=1
a.capture()
```python
可以用脚本精灵来定时触发事件
什么叫需要实时刷新才能收到消息,不是太能理解。这个和2分钟定时截图又有什么关系,现象和目标都没描述清楚。
python可以实现你说的这种功能,有兴趣可以联系下我
我理解主要是两点:
1、刷新桌面,可以直接模拟发送F5键盘按键消息即可;
2、截图功能也比较简单,获取桌面DC,拷贝到内存中,保存成bmp图片就行了。
不同的软件,刷新方法都不同的,比如:浏览器打开的web页面?还是windows上安装的其他软件?刷新之前是否需要登录,是否需要做配置,不同的操作可能对应的解决方法也不同。
可以做一个exe工具,实现windows exe工具的控件操作和截图。
完全支撑你的需求。
路过,在macos下用python写了一个,基于像素比较图片,刷新内容有变化自动截图。看到很多大佬已经针对win回答了,这里就没有发布到win测试。
,自测还不错。这个。可以python模拟鼠标点击,然后找一个截图软件设置快捷键。每次python模拟点击后就自动运行快捷键。实现了刷新和截图,也不用那么费事
我已经帮你写好啦哈哈 如果需要联系我 因为不知道具体怎么刷新 我没有加入 刷新功能
目前是定时截图 自动对比图片是否相同 然后保留 有改变 的截图
其实你可以说是个啥软件,这样更容易帮到你