本文不同于VC下使用ScrnSave.lib进行屏保制作的方式,

而是在VS下以其内在原理,从无到有进行一个简单的WIN32屏保开发,

只要你拥有一些简单的WIN32程序编写的经验,便可以很轻松的明白并编写出此类屏保。

首先,要实现一个屏保,我们需要实现三件事。

  • 操作系统自动运行程序
  • 全屏幕的窗口
  • 用户输入即退出

只要实现了这三件事,那么便可以称之为简单意义上的屏保了。

操作系统自动运行程序:

这很幸运,因为只要将用户程序的后缀名改为.scr, 将其放到正确的系统目录下,便可以成为

真正的屏幕保护程序,在空闲时自动得到操作系统的调用,而不用我们花大量时间编写代码。

全屏幕的窗口:

这个也很简单,只要我们将窗口创建为全屏显示,那么自然也没有太大问题了。

你可以这样做:

hwnd = CreateWindow(L"BeyondScrnSaver", NULL,                                             //注意这里初始化HWND_DESKTOP,
            WS_POPUP | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 0,   //因为在窗口上播放视频,窗口显示太快会看到先显示背景,所以我先将其大小调整为0
            0, HWND_DESKTOP, NULL, hInstance, NULL);

用户输入即退出:

只要在消息窗口过程中进行鼠标移动,点击,以及键盘输入事件的处理,便可以实现该退出过程。

好了,讲了这么多,现在我们从实现一个屏幕保护程序的窗口框架开始吧....

/*---------------------------------------------------------------------------------
【Cpp文件】:ScreenMain.cpp          Created by Beyond Ray,2014年4月
(描述):使用天下叁CG《墨龙纪》制作成简单的屏保
-----------------------------------------------------------------------------------*/
//------------------------【头文件】--------------------------------
#include #include //使用swprintf_s函数所需的头文件
#include "resource.h"                         //资源文件(只用于图标)
//------------------------【全局函数声明】--------------------------
LRESULT CALLBACK    WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);         //主窗口过程函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hwndFrameWnd = 0;
HWND hwnd = 0;
RECT rect;
//---------------------------【设计一个窗口类】------------------------------
WNDCLASSEX wndClass = { 0 };                   //用WINDCLASSEX定义一个窗口类,并初始化
wndClass.cbSize = sizeof(WNDCLASSEX);          //设置结构体的字节数大小
wndClass.style = CS_HREDRAW | CS_VREDRAW;      //设置窗口的样式
wndClass.lpfnWndProc = WndProc;                    //设置指向窗口过程函数的指针
wndClass.cbClsExtra = 0;                       //窗口类的附加内存,取0就可以了
wndClass.cbWndExtra = 0;                       //窗口的附加内存,依然取0就行了
wndClass.hInstance = hInstance;                    //指定包含窗口过程的程序的实例句柄。
wndClass.hIcon = (HICON)LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));    //本地加载自定义ico图标
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //指定窗口类的光标句柄。
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  //指定一个白色画刷句柄
wndClass.lpszMenuName = NULL;                  //用一个以空终止的字符串,指定菜单资源的名字。
wndClass.lpszClassName = L"BeyondScrnSaver"; //用一个以空终止的字符串,指定窗口类的名字。
//----------------------------【注册一个窗口类】------------------------------
if (!RegisterClassEx(&wndClass))
return -1;
//-----------------------------【创建一个窗口】-------------------------------
hwnd = CreateWindow(L"BeyondScrnSaver", NULL,                    //注意这里初始化HWND_DESKTOP,并且在最初大小为0,
WS_POPUP | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 0, //以防止视频还没播放前看到白屏
0, HWND_DESKTOP, NULL, hInstance, NULL);
//窗口更新显示
MoveWindow(hwnd, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), true);
ShowWindow(hwnd, nShowCmd);             //调用ShowWindow函数来显示窗口
UpdateWindow(hwnd);                     //对窗口进行更新
//------------------------------【消息循环过程】-------------------------------
MSG msg = { 0 };                           //定义并初始化msg
while (GetMessage(&msg, NULL, 0, 0))        //使用while循环,如果消息不是WM_QUIT消息,就继续循环
{
TranslateMessage(&msg);         //将虚拟键消息转换为字符消息
DispatchMessage(&msg);          //分发一个消息给窗口程序。
}
//-------------------------------【将窗口类注销】-------------------------------
UnregisterClass(L"BeyondScrnSaver", wndClass.hInstance);  //程序准备结束,注销窗口类
return 0;
}
//-----------------------------------【WndProc( )函数】-------------------------------------------
// Desc:窗口过程函数WndProc,对窗口消息进行处理
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)                        //switch语句开始
{
case WM_CREATE:
break;
case WM_DESTROY:            //窗口销毁消息
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);        //调用缺省的窗口过程
}
return 0;           //正常退出
}

当我们实现了一个基本的窗口框架之后,我们便要处理“第三件事”,也就是说

让操作系统实现人机交互的自动退出,那么可以在窗口过程函数WndProc中这么实现:

1.在鼠标点击,键盘键入事件发生时,窗口自动退出

(mciSendString(L"close movie", g_buf, sizeof(g_buf), NULL);  是关闭墨龙纪视频,这里先忽略它)

   case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
MoveWindow(hwnd, 0, 0, 0, 0, true);     //关闭窗口速度比视频退出慢,先使其不可见,以防止看到白屏
PostQuitMessage(0);                     // 退出窗口程序
mciSendString(L"close movie", g_buf, sizeof(g_buf), NULL);    //关闭墨龙纪视频
break;

2.在鼠标光标移动时,窗口自动退出。
#1.先添加全局变量

//------------------------【全局变量】------------------------------
INT         g_nOrigin_X = -1, g_nOrigin_Y = -1;   //鼠标指针起始位置

#2.WM_MOUSEMOVE事件

case WM_MOUSEMOVE:
{
int nNew_X = LOWORD(lParam);
int nNew_Y = HIWORD(lParam);
if (g_nOrigin_X == -1 && g_nOrigin_Y == -1)     //设置鼠标指针初始点坐标
{
g_nOrigin_X = nNew_X;
g_nOrigin_Y = nNew_Y;
}
else if (g_nOrigin_X != nNew_X  &&  g_nOrigin_Y != nNew_Y)    //判断鼠标移动检测
{
MoveWindow(hwnd, 0, 0, 0, 0, true);
mciSendString(L"close movie", g_buf, sizeof(g_buf), NULL);
PostQuitMessage(0);
}
}
break;

实现了这些之后,一个什么都没有的屏保框架也就完成了,接下来我们给它添加一部可播放的视频,
这里我用了来自天下叁CG的《墨龙纪》。
#1.先添加全局变量:

TCHAR     g_buf[256];                         //接收《墨龙纪》返回信息的缓冲区

#2.然后在CreateWindow和MoveWindow后面添加如下代码:

//播放《墨龙纪》视频(我将视频放在了 F:/天下叁CG/墨龙纪.avi路径当中,注意调整)
wchar_t open1[100];
swprintf_s(open1, L"open F:/天下叁CG/墨龙纪.avi type MPEGVideo Alias movie parent %u Style %u notify", hwnd, WS_CHILD);
mciSendString(open1, g_buf, sizeof(g_buf), NULL);
mciSendString(TEXT("play movie fullscreen repeat"), g_buf, sizeof(g_buf), NULL);

关于mciSendString函数我在这里不再详解了,具体可以参考百度百科
链接:http://baike.baidu.com/link?url=y2TRxk3x-TfofomrPEbmG4AO_GUbJ-KSK3tHOQS3mffKV2xJFOfVHLtnKOKts95kH9AZQRN-os2ToLgM8gZmjK

好了,实现到这里,按下F5我们可以看到墨龙纪视频成功播放出来了,但是移动鼠标和键入键盘
都没有响应,这是怎么回事?那是因为在消息循环当中,操作系统优先将消息派发到窗口上层的视频
消息处理接口当中去了,那么怎么办呢?我们可以使用SendMessage手动将消息传递到窗口过程
当中去,就像这样:

if (msg.message == WM_MOUSEMOVE || WM_SYSKEYDOWN || WM_KEYDOWN ||
WM_LBUTTONDOWN || WM_RBUTTONDOWN || WM_MBUTTONDOWN) //由于系统默认将消息传递给窗口上层的视频,
{                           //而窗口接受不到消息,所以我们手动进行传送。
SendMessage(hwnd, msg.message, msg.wParam, msg.lParam);
}

嗯,在按F5来编译执行一遍,这时我们就可以看到很精彩的CG动画墨龙纪了,而且按下键盘,移动鼠标,以及
点击鼠标,都会很快的正常退出,一切都进行的很圆满。

这时我们将Release文件夹(我配置选项卡设为了Release模式)下的exe执行文件后缀名改为.scr,如果是64
位操作系统,将其放置到C:/Windows/SysWOW64路径下,如果是32位操作系统,将其放置到
C:/Windows/System32路径下,然后再打开“屏幕保护设置”,这时我们会发现存在一个问题,
即使我们没有“预览”,它却已经运行了。

这是因为,Windows系统会通过不同的命令行参数,以三种方式运行屏幕保护程序:

方式                                                            命令行参数

正常(由系统自动执行,全屏幕显示)                       /s

配置(屏幕保护程序选项卡中的设定)                          /c

预览(显示在屏幕保护程序选项卡的小窗口中)       /p

所以,为了让屏幕保护程序能够在小窗口中自动运行,并且可以设置,以及如我们所愿一般的预览,
我们需要在【设计窗口类】和【注册窗口类】之间加入如下代码:

if (__argc > 1)
{
if (strstr(__argv[1], "/p"))  //预览小窗口
{
if (__argc == 3)
{
hwndFrameWnd = (HWND)atoi(__argv[2]);
GetClientRect(hwndFrameWnd, &rect);
wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);  //预览窗口的黑色背景刚好协调
wndClass.lpfnWndProc = SmallWndProc;                          //为窗口类重新指定窗口函数
//----------------------------【注册一个窗口类】------------------------------
if (!RegisterClassEx(&wndClass))
return -1;
hwnd = CreateWindow(L"BeyondScrnSaver", NULL,
WS_CHILD | WS_VISIBLE,
rect.left, rect.top,
rect.right, rect.bottom,
hwndFrameWnd, NULL,
hInstance, NULL);
//----------------------------【播放《墨龙纪》视频】--------------------------
//打开墨龙纪视频
wchar_t open1[100];
swprintf_s(open1, L"open F:/天下叁CG/墨龙纪.avi type MPEGVideo Alias movie parent %u Style %u notify", hwnd, WS_CHILD);
mciSendString(open1, g_buf, sizeof(g_buf), NULL);
//设置窗口大小并播放
swprintf_s(open1, L"put movie window at 0 0 %d %d", rect.right - rect.left, rect.bottom - rect.top);
mciSendString(open1, g_buf, sizeof(g_buf), NULL);
mciSendString(L"play movie repeat", g_buf, sizeof(g_buf), NULL);
//------------------------------【消息循环过程】-------------------------------
MSG msg = { 0 };                           //定义并初始化msg
while (GetMessage(&msg, NULL, 0, 0))        //使用while循环,如果消息不是WM_QUIT消息,就继续循环
{
TranslateMessage(&msg);         //将虚拟键消息转换为字符消息
DispatchMessage(&msg);          //分发一个消息给窗口程序。
}
return 0;
}
}
else if (strchr(__argv[1], 'c')) //设置选项卡
{
MessageBox(NULL, L"This screen saver doesn't have configuration", L"Blank Screen Saver", MB_OK);
return 0;
}
}

在这里,我主要解释下预览小窗口部分的思想,我们先得到预览窗口的窗口句柄,以及尺寸,
然后在创建一个同样大小的子窗口,紧接着我们在该子窗口上用mciSendString打开了一个基于该窗口的墨龙纪视频,
然后在把该视频大小设置成了窗口的大小(视频打开时默认为其本身的尺寸大小),并进行循环播放,
最后我们用了另外一个消息循环过程来响应事件,以致于不会立刻结束视频播放退出线程。
(注意,这里我们在注册窗口类时用了另外一个SmallWndProc 窗口过程,以得到我们希望的事件响应。)
下面这里是有关SmalllWndProc窗口过程部分的代码:

//------------------------【全局函数声明】--------------------------
LRESULT CALLBACK SmallWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);       //预览窗口过程函数
//-----------------------------------【SmallWndProc( )函数】-------------------------------------------
// Desc:预览窗口过程函数,对预览窗口消息进行处理
//-----------------------------------------------------------------------------------------------------
LRESULT CALLBACK SmallWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)                        //switch语句开始
{
case WM_DESTROY:            //窗口销毁消息
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);        //调用缺省的窗口过程
}
return 0;           //正常退出
}

到此为止,把代码整合在一起,我们就可以得到一个即能在小窗口上预览《墨龙纪》CG,又能实现
空闲时操作系统自动调用的真正意义上的屏保了,只要我们依旧将exe执行文件后缀改成.scr放置到相应的
系统目录下便能实现了。

下面我将所有代码整合在一起发放一遍:


/*---------------------------------------------------------------------------------
【Cpp文件】:ScreenMain.cpp          Created by Beyond Ray,2014年4月
(描述):使用天下叁CG《墨龙纪》制作成简单的屏保
-----------------------------------------------------------------------------------*/
//------------------------【头文件】--------------------------------
#include #include //使用swprintf_s函数所需的头文件
#include "resource.h"                         //资源文件(只用于图标)
//------------------------【全局变量】------------------------------
INT         g_nOrigin_X = -1, g_nOrigin_Y = -1;   //鼠标指针起始位置
TCHAR       g_buf[256];                         //接收《墨龙纪》返回信息的缓冲区
//------------------------【全局函数声明】--------------------------
LRESULT CALLBACK    WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);         //主窗口过程函数
LRESULT CALLBACK SmallWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);       //预览窗口过程函数
//-----------------------------------【WinMain( )函数】-----------------------------------------
//  Desc:Windows应用程序的主入口
//----------------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hwndFrameWnd = 0;
HWND hwnd = 0;
RECT rect;
//---------------------------【设计一个窗口类】------------------------------
WNDCLASSEX wndClass = { 0 };                   //用WINDCLASSEX定义一个窗口类,并初始化
wndClass.cbSize = sizeof(WNDCLASSEX);          //设置结构体的字节数大小
wndClass.style = CS_HREDRAW | CS_VREDRAW;      //设置窗口的样式
wndClass.lpfnWndProc = WndProc;                    //设置指向窗口过程函数的指针
wndClass.cbClsExtra = 0;                       //窗口类的附加内存,取0就可以了
wndClass.cbWndExtra = 0;                       //窗口的附加内存,依然取0就行了
wndClass.hInstance = hInstance;                    //指定包含窗口过程的程序的实例句柄。
wndClass.hIcon = (HICON)LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));    //本地加载自定义ico图标
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //指定窗口类的光标句柄。
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  //指定一个白色画刷句柄
wndClass.lpszMenuName = NULL;                  //用一个以空终止的字符串,指定菜单资源的名字。
wndClass.lpszClassName = L"BeyondScrnSaver"; //用一个以空终止的字符串,指定窗口类的名字。
if (__argc > 1)
{
if (strstr(__argv[1], "/p"))  //预览小窗口
{
if (__argc == 3)
{
hwndFrameWnd = (HWND)atoi(__argv[2]);
GetClientRect(hwndFrameWnd, &rect);
wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);  //预览窗口的黑色背景刚好协调
wndClass.lpfnWndProc = SmallWndProc;                          //为窗口类重新指定窗口函数
//----------------------------【注册一个窗口类】------------------------------
if (!RegisterClassEx(&wndClass))
return -1;
hwnd = CreateWindow(L"BeyondScrnSaver", NULL,
WS_CHILD | WS_VISIBLE,
rect.left, rect.top,
rect.right, rect.bottom,
hwndFrameWnd, NULL,
hInstance, NULL);
//----------------------------【播放《墨龙纪》视频】--------------------------
//打开墨龙纪视频
wchar_t open1[100];
swprintf_s(open1, L"open F:/天下叁CG/墨龙纪.avi type MPEGVideo Alias movie parent %u Style %u notify", hwnd, WS_CHILD);
mciSendString(open1, g_buf, sizeof(g_buf), NULL);
//设置窗口大小并播放
swprintf_s(open1, L"put movie window at 0 0 %d %d", rect.right - rect.left, rect.bottom - rect.top);
mciSendString(open1, g_buf, sizeof(g_buf), NULL);
mciSendString(L"play movie repeat", g_buf, sizeof(g_buf), NULL);
//------------------------------【消息循环过程】-------------------------------
MSG msg = { 0 };                           //定义并初始化msg
while (GetMessage(&msg, NULL, 0, 0))        //使用while循环,如果消息不是WM_QUIT消息,就继续循环
{
TranslateMessage(&msg);         //将虚拟键消息转换为字符消息
DispatchMessage(&msg);          //分发一个消息给窗口程序。
}
return 0;
}
}
else if (strchr(__argv[1], 'c')) //设置选项卡
{
MessageBox(NULL, L"This screen saver doesn't have configuration", L"Blank Screen Saver", MB_OK);
return 0;
}
}
//----------------------------【注册一个窗口类】------------------------------
if (!RegisterClassEx(&wndClass))
return -1;
//-----------------------------【创建一个窗口】-------------------------------
hwnd = CreateWindow(L"BeyondScrnSaver", NULL,                    //注意这里初始化HWND_DESKTOP,并且在最初大小为0,
WS_POPUP | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 0, //以防止视频还没播放前看到白屏
0, HWND_DESKTOP, NULL, hInstance, NULL);
//播放《墨龙纪》视频(我将视频放在了 F:/天下叁CG/墨龙纪.avi路径当中,注意调整)
wchar_t open1[100];
swprintf_s(open1, L"open F:/天下叁CG/墨龙纪.avi type MPEGVideo Alias movie parent %u Style %u notify", hwnd, WS_CHILD);
mciSendString(open1, g_buf, sizeof(g_buf), NULL);
mciSendString(TEXT("play movie fullscreen repeat"), g_buf, sizeof(g_buf), NULL);
//视频播放出来了,可以把窗口显示出来了
MoveWindow(hwnd, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), true);
ShowWindow(hwnd, nShowCmd);             //调用ShowWindow函数来显示窗口
UpdateWindow(hwnd);                     //对窗口进行更新
//------------------------------【消息循环过程】-------------------------------
MSG msg = { 0 };                           //定义并初始化msg
while (GetMessage(&msg, NULL, 0, 0))        //使用while循环,如果消息不是WM_QUIT消息,就继续循环
{
TranslateMessage(&msg);         //将虚拟键消息转换为字符消息
DispatchMessage(&msg);          //分发一个消息给窗口程序。
if (msg.message == WM_MOUSEMOVE || WM_SYSKEYDOWN || WM_KEYDOWN ||
WM_LBUTTONDOWN || WM_RBUTTONDOWN || WM_MBUTTONDOWN) //由于系统默认将消息传递给窗口上层的视频,
{                                                       //而窗口接受不到消息,所以我们手动进行传送。
SendMessage(hwnd, msg.message, msg.wParam, msg.lParam);
}
}
//-------------------------------【将窗口类注销】-------------------------------
UnregisterClass(L"BeyondScrnSaver", wndClass.hInstance);  //程序准备结束,注销窗口类
return 0;
}
//-----------------------------------【WndProc( )函数】-------------------------------------------
// Desc:窗口过程函数WndProc,对窗口消息进行处理
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)                        //switch语句开始
{
case WM_CREATE:
ShowCursor(false);
break;
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
MoveWindow(hwnd, 0, 0, 0, 0, true);     //关闭窗口速度比视频退出慢,先使其不可见,以防止看到白屏
PostQuitMessage(0);                     // 退出窗口程序
mciSendString(L"close movie", g_buf, sizeof(g_buf), NULL);    //关闭墨龙纪视频
break;
case WM_MOUSEMOVE:
{
int nNew_X = LOWORD(lParam);
int nNew_Y = HIWORD(lParam);
if (g_nOrigin_X == -1 && g_nOrigin_Y == -1)     //设置鼠标指针初始点坐标
{
g_nOrigin_X = nNew_X;
g_nOrigin_Y = nNew_Y;
}
else if (g_nOrigin_X != nNew_X  &&  g_nOrigin_Y != nNew_Y)    //判断鼠标移动检测
{
MoveWindow(hwnd, 0, 0, 0, 0, true);
mciSendString(L"close movie", g_buf, sizeof(g_buf), NULL);
PostQuitMessage(0);
}
}
break;
case WM_DESTROY:            //窗口销毁消息
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);        //调用缺省的窗口过程
}
return 0;           //正常退出
}
//-----------------------------------【SmallWndProc( )函数】-------------------------------------------
// Desc:预览窗口过程函数,对预览窗口消息进行处理
//-----------------------------------------------------------------------------------------------------
LRESULT CALLBACK SmallWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)                        //switch语句开始
{
case WM_DESTROY:            //窗口销毁消息
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);        //调用缺省的窗口过程
}
return 0;           //正常退出
}

最后再来一张《墨龙纪》精彩CG的截图:

怎么样,CG的动画效果还不错吧!

为了让读者能够更好的理解代码的调用方式,我将资源上传到CSDN上了,有需要的童鞋可以下载。
(项目使用VS2013编写,编译器版本不够就直接复制代码吧...)

BeyondScreenSaver项目传送门:http://download.csdn.net/detail/u013025310/7202247
天下叁《墨龙纪》CG资源传送门:http://pan.baidu.com/s/1kTiaP1P

简单的WIN32屏保开发制作(可播放视频)相关推荐

  1. Java彩球屏保的制作

    一.首先建立包ball,然后创建模板类BallModel BallModel类代码如下 : package ball;import java.awt.Color; import java.awt.Gr ...

  2. linux开发板madplay播放视频,Madplay播放器移植ARM(超简单)

    一.下载 1.madplay-0.15.2b.tar.gz 2.libmad-0.15.1b.tar.gz 3.libid3tag-0.15.1b.tar.gz 4.zlib-1.1.4.tar.gz ...

  3. java基于ssm开发的电视剧播放视频系统页面很漂亮哦

    简介 ssm开发的视频网站.本项目主要包括了视频展示和查询功能,用户中心,积分管理,管理员管理等功能. 演示视频 https://www.bilibili.com/video/BV1tT4y1N7t8 ...

  4. iOS开发-停止WebView播放视频/音频 1

    很多时候在WebView播放视频的时候,会有一些通知或者其他语音播报的内容,这个时候就要暂停WebView正在播放的视频了. 通过JS直接控制网页中的 video/media标签 // 停止视频播放 ...

  5. WPF 制作 Windows 屏保

    分享如何使用WPF 制作 Windows 屏保 WPF 制作 Windows 屏保 作者:驚鏵 原文链接:https://github.com/yanjinhuagood/ScreenSaver 框架 ...

  6. windows server 2016域控屏保策略设置

    1.使用Photo Screensaver Maker工具制作scr格式的屏保 2.制作完成的scr格式屏保文件,将文件放入服务器 3.新建策略在用户配置-策略-管理模板-控制面板-个性化依次启用红色 ...

  7. android 屏保_Mac视频屏保随心换!

    今天给大家分享一个好玩的小软件,能够使用 视频作为 mac 屏保. 有意思的Mac视频屏保软件https://www.zhihu.com/video/1090030544749834240 软件链接: ...

  8. 锁屏壁纸开发 Android,Android开发自己的锁屏壁纸

    SurfaceView  SurfaceHolder  MediaPlayer    Service      BroadcastReceiver    KeyguardManager    Powe ...

  9. 如何制作Windows10屏保?简单呀--Windows batch

    Hi!我是你们的python大猿呀! [Hi~ o(* ̄▽ ̄*)ブ] 目录: 1.运行效果 2.代码 3.如何运行 1.运行效果 这是个时间屏保,显示精准时间,数字使用的是0组成 2.代码 整体 @e ...

最新文章

  1. Java 常用对象-Date类和Calender类
  2. mysqldump全量恢复_mysql 备份与恢复(全量与增量)
  3. 温度测量系统流程图_土壤温度和水分含量是如何调控城市草坪土壤N2O通量的?——来自LICOR土壤温室气体通量长期监测系统14个月的测量数据...
  4. 数据结构之判断一棵树是不是满二叉树
  5. php接口开发 安全_PHP开发api接口安全验证的实例讲解
  6. php 调用父类变量,PHP-通过实例化父类访问常量
  7. 中国大陆物联网驶入快车道 台商抢上车
  8. Reachability的用法 判断用户的网络状态
  9. linux c 静态连接,Linux cmake 静态链接boost
  10. 刘铎 计算机学院,离散数学及应用 [刘铎 编著] 2013年版
  11. “十四五”国家信息化规划发布,十大要点解读
  12. 勤于奋:国外LEAD跟联盟经理沟通聊天软件,Skype注册教程
  13. Apple Pencil平替哪个好?Apple Pencil平替笔推荐
  14. 使用cubemx建立一个内部flash虚拟一个U盘的工程
  15. 乐优商城第六篇:域名访问与品牌查询
  16. 深度参与 openGauss Developer Day 2022,云和恩墨在多项活动中展风采
  17. 亚信全面回归电信业务 华为可能有意收购
  18. Excel技巧:如何将空格分隔的一组数据粘贴到excel为列
  19. java hashtable import_Java Hashtable 接口 - Java 教程 - 自强学堂
  20. 2.2 关系代数的五个基本操作

热门文章

  1. 【Android】AppCompatTextView的使用详解
  2. 通过涂鸦的开发板完成可以语音控制的智能RGB彩灯开发
  3. Grafana7+InfluxDB2+Jmeter5 搭建可视化性能测试监控平台
  4. Nachos实习——Lab1线程机制实习报告
  5. 【移动端】vue宣传海报拼接二维码
  6. vue 导出Excel乱码问题解决方案
  7. Git——远程管理版本操作(Tortoise(小乌龟)图形化操作、git命令行操作)
  8. c++做plc上位机 语言,C++上位机通过socket读写PLC
  9. c语言指针示例代码,C语言之指针(示例代码)
  10. 全角转半角,JAVA对中文的处理