C/C++获取CPU等硬件信息&&屏幕截图
打算练习Socket的时候用用,最近有点小事情,没时间继续完善,先把写的这些代码贴上来,有空了再完善一下。
HardwareInfo.h
#include <stdio.h>
#include <windows.h>
#include <vfw.h> #pragma comment(lib,"Vfw32.lib")
#pragma comment(lib,"winmm.lib")
#ifndef VER_NT_WORKSTATION
#define VER_NT_WORKSTATION 1
#endif /*
// vc6.0需定义
typedef struct _MEMORYSTATUSEX {
DWORD dwLength; // 结构体数据大小 sizeof(_MEMORYSTATUSEX)
DWORD dwMemoryLoad; // 内存使用率
LONGLONG ullTotalPhys; // 物理内存总大小(单位:字节)
LONGLONG ullAvailPhys; // 物理内存可用大小(单位:字节)
LONGLONG ullTotalPageFile; // 总页面大小(物理内存总大小+硬盘划分的虚拟内存总大小)(单位:字节)
LONGLONG ullAvailPageFile; // 当前进程能获取的最大内存数(单位:字节)
LONGLONG ullTotalVirtual; // 当前进程最大内存寻址地址(默认2GB,开启大地址后就是4GB)
LONGLONG ullAvailVirtual; // 当前进程可用最大内存(单位:字节)
LONGLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;
*/
typedef struct _OSVERSIONINFOEXA1 {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
CHAR szCSDVersion[];
WORD wServicePackMajor;
WORD wServicePackMinor;
WORD wSuiteMask;
BYTE wProductType;
BYTE wReserved;
} OSVERSIONINFOEXA1, *POSVERSIONINFOEXA1, *LPOSVERSIONINFOEXA1; /*
屏幕截图
lpData:存放截图数据指针
hWnd :目标窗口,默认为桌面
成功返回截图数据大小,失败返回0.
*/
DWORD PrtScr(PCHAR *lpData, HWND hWnd = ); /*
是否有摄像头
有摄像头返回TRUE,否则返回FALSE
*/
BOOL HaveCameras(void); /*
获取CPU名称
成功返回CPU名称,失败返回NULL(VS2013不支持Debug模式下获取)
*/
LPSTR GetCPUName(void); /*
获取CPU制造商
成功返回CPU制造商,失败返回NULL(VS2013不支持Debug模式下获取)
*/
LPSTR GetCPUManufacturer(void); /*
获取声卡名字
成功返回声卡名字,失败返回NULL
*/
LPSTR GetSoundCarName(void); /*
获取磁盘容量信息
diskPath:盘符
used:已用空间
freed:剩余空间
total:总空间
成功返回TRUE,失败返回FALSE
*/
BOOL GetDiskSpaceInfo(LPSTR diskPath, float *used, float *freed, float *total); /*
获取运行内存总额
返回运存总额
*/
FLOAT GetSysRam(void); /*
获取运存已用比例
返回运存已用比例
*/
DWORD GetRamProportion(void); /*
获取系统启动时间
返回格式化文本字符串
*/
LPSTR GetSysStartTime(void); /*
获取系统信息
dwMajor:高版本位
dwMinjor:低版本位
bDesc:是否获取系统描述
bBit:是否获取位数
bSPVer:是否获取系统补丁包版本
bBuildVer:是否获取内部版本
成功返回系统信息字符串,失败返回NULL
*/
LPSTR GetSysInfo(DWORD *dwMajor = NULL, DWORD *dwMinjor = NULL, BOOL bDesc = FALSE, BOOL bBit = FALSE, BOOL bSPVer = FALSE, BOOL bBuildVer = FALSE);
HardwareInfo.cpp
#include "HardwareInfo.h" int main(void)
{ LPSTR lpCPUName = GetCPUName();
LPSTR lpCPUManu = GetCPUManufacturer();
LPSTR lpSoundCarName = GetSoundCarName();
printf("处理器: %s\n\n", lpCPUName);
printf("CPU制造商: %s\n\n", lpCPUManu);
printf("声卡: %s\n\n", lpSoundCarName);
float used, usable, total;
GetDiskSpaceInfo("D:", &used, &usable, &total);
printf("D盘 已用: %.1fG, 可用:%.1fG, 总大小:%.1fG\n\n", used, usable, total);
printf("运行内存: %.1fG, 已用%d%%\n\n", GetSysRam(), GetRamProportion());
LPSTR lpStartTime = GetSysStartTime();
printf("已开机: %s\n\n", GetSysStartTime());
LPSTR lpSysVer = GetSysInfo(, , , , );
printf("系统版本: %s\n\n", lpSysVer);
free(lpCPUName);
free(lpCPUManu);
free(lpSoundCarName);
free(lpStartTime);
free(lpSysVer); Sleep();
DWORD dwLen = ;
char *lpData = NULL; dwLen = PrtScr(&lpData);
FILE *wj = NULL;
fopen_s(&wj, "c:\\1.bmp", "wb");
fwrite(lpData, dwLen, , wj);
fclose(wj);
free(lpData);
system("c:\\1.bmp");
system("pause");
return ;
} DWORD PrtScr(PCHAR *lpData, HWND hWnd)
{
HDC hdcScreen, hdcMem;
RECT rc = { }, desRc = { };
HBITMAP hbmScreen = NULL;
BITMAP bmpScreen = { };
BITMAPINFOHEADER bitInfo = { };
BITMAPFILEHEADER bitHead = { };
DWORD dwBmpSize, dwSizeofDIB;
char *lpbitmap = NULL;
int width, height; if (!hWnd)
hWnd = GetDesktopWindow();
GetWindowRect(hWnd, &rc);
GetWindowRect(GetDesktopWindow(), &desRc); hdcScreen = GetDC(NULL);
hdcMem = CreateCompatibleDC(hdcScreen);
if (!hdcMem)
return ;
hbmScreen = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top);
if (!hbmScreen)
return ;
SelectObject(hdcMem, hbmScreen);
width = (rc.right > desRc.right) ? (desRc.right - rc.left) : (rc.right - rc.left);
height = (rc.bottom > desRc.bottom) ? (desRc.bottom - rc.top) : (rc.bottom - rc.top);
if (!BitBlt(hdcMem, , , width, height, hdcScreen, rc.left, rc.top, SRCCOPY))
return ;
GetObject(hbmScreen, sizeof(BITMAP), &bmpScreen); bitInfo.biSize = sizeof(BITMAPINFOHEADER);
bitInfo.biWidth = width;
bitInfo.biHeight = height;
bitInfo.biPlanes = ;
bitInfo.biBitCount = ;
bitInfo.biCompression = BI_RGB; dwBmpSize = ((bmpScreen.bmWidth * bitInfo.biBitCount + ) / ) * * bmpScreen.bmHeight;
lpbitmap = (char *)malloc(dwBmpSize);
if (!lpbitmap)
return ;
GetDIBits(hdcScreen, hbmScreen, , (UINT)bmpScreen.bmHeight, lpbitmap, (BITMAPINFO *)&bitInfo, DIB_RGB_COLORS); dwSizeofDIB = dwBmpSize + sizeof(bitHead)+sizeof(bitInfo);
bitHead.bfOffBits = (DWORD)sizeof(bitHead)+(DWORD)sizeof(bitInfo);
bitHead.bfSize = dwSizeofDIB;
// 必须是字符BM或者十六进制代替0x4D42="BM"
bitHead.bfType = MAKEWORD('B', 'M'); *lpData = (char *)malloc(dwSizeofDIB);
if (!*lpData)
return ;
memmove(*lpData, &bitHead, sizeof(bitHead));
memmove(*lpData + sizeof(bitHead), &bitInfo, sizeof(bitInfo));
memmove(*lpData + sizeof(bitHead)+sizeof(bitInfo), lpbitmap, dwBmpSize);
free(lpbitmap);
DeleteObject(hbmScreen);
DeleteObject(hdcMem);
ReleaseDC(NULL, hdcScreen);
return dwSizeofDIB;
} BOOL HaveCameras(void)
{
char ver[] = { }, name[] = { };
UINT num = ; do
{
memset(name, , );
if (capGetDriverDescription(num, name, , ver, ))
{
num++;
}
} while (lstrlen(name));
return (num ? TRUE : FALSE);
} LPSTR GetCPUName(void)
{
LPSTR lpName = (LPSTR)malloc();
memset(lpName, , ); __asm{
PUSHAD
MOV EAX, 0x80000002
CPUID
MOV ESI, [EBP - 0x4]
MOV SS : [ESI], EAX
MOV SS : [ESI + 0x4], EBX
MOV SS : [ESI + 0x8], ECX
MOV SS : [ESI + 0xC], EDX
MOV EAX, 0x80000003
CPUID
MOV SS : [ESI + 0x10], EAX
MOV SS : [ESI + 0x14], EBX
MOV SS : [ESI + 0x18], ECX
MOV SS : [ESI + 0x1C], EDX
MOV EAX, 0x80000004
CPUID
MOV SS : [ESI + 0x20], EAX
MOV SS : [ESI + 0x24], EBX
MOV SS : [ESI + 0x28], ECX
MOV SS : [ESI + 0x2C], EDX
POPAD
}
return lpName;
} LPSTR GetCPUManufacturer(void)
{
LPSTR lpStr = (LPSTR)malloc();
memset(lpStr, , ); __asm{
PUSHAD
XOR EAX, EAX
CPUID
MOV EAX, DWORD PTR SS : [EBP - 0x4]
MOV DWORD PTR SS : [EAX], EBX
MOV DWORD PTR SS : [EAX + 0x4], EDX
MOV DWORD PTR SS : [EAX + 0x8], ECX
POPAD
} if (!lstrcmp("GenuineIntel", lpStr))
memmove(lpStr, "Intel Corporation.", );
else if (!lstrcmp("AuthenticAMD", lpStr))
memmove(lpStr, "Advanced Micro Devices.", );
else if (!lstrcmp("AMD ISBETTER", lpStr))
memmove(lpStr, "Advanced Micro Devices.", );
else if (!lstrcmp("Geode By NSC", lpStr))
memmove(lpStr, "National Semiconductor.", );
else if (!lstrcmp("CyrixInstead", lpStr))
memmove(lpStr, "Cyrix Corp., VIA Inc.", );
else if (!lstrcmp("NexGenDriven", lpStr))
memmove(lpStr, "NexGen Inc., Advanced Micro Devices.", );
else if (!lstrcmp("CentaurHauls", lpStr))
memmove(lpStr, "IDT\\Centaur, Via Inc.", );
else if (!lstrcmp("UMC UMC UMC ", lpStr))
memmove(lpStr, "United Microelectronics Corp.", );
else if (!lstrcmp("RiseRiseRise", lpStr))
memmove(lpStr, "Rise.", );
else if (!lstrcmp("GenuineTMx86", lpStr))
memmove(lpStr, "Transmeta.", );
else if (!lstrcmp("TransmetaCPU", lpStr))
memmove(lpStr, "Transmeta.", );
else
memmove(lpStr, "Unknown Manufacturer.", ); return lpStr;
} LPSTR GetSoundCarName(void)
{
WAVEOUTCAPS wav = { };
LPSTR lpName = (LPSTR)malloc(); waveOutGetDevCaps(, &wav, sizeof(wav)); // 有点电脑获取的数据不完整,缺失 " Audio)",为了美观获取不到的手动加入
if (wav.szPname[lstrlen(wav.szPname)-] != ')')
sprintf_s(lpName, , "%s Audio)", wav.szPname);
else
sprintf_s(lpName, , "%s", wav.szPname);
return lpName;
} BOOL GetDiskSpaceInfo(LPSTR diskPath, float *used, float *freed, float *total)
{
ULARGE_INTEGER a1, b1, c1;
LONGLONG a, b, c;
float v1, v2, v3;
if (!GetDiskFreeSpaceEx(diskPath, &a1, &b1, &c1))
return FALSE; a = (LONGLONG)a1.QuadPart;
b = (LONGLONG)b1.QuadPart;
c = (LONGLONG)c1.QuadPart;
c = b - a; v1 = (float)(a / ( * * 1024.0));
v2 = (float)(b / ( * * 1024.0));
v3 = (float)(c / ( * * 1024.0)); memmove(used, &v3, sizeof(float));
memmove(freed, &v1, sizeof(float));
memmove(total, &v2, sizeof(float)); return TRUE;
} FLOAT GetSysRam(void)
{
typedef BOOL(WINAPI *func)(LPMEMORYSTATUSEX);
MEMORYSTATUSEX stMem = { }; func GlobalMemoryStatusEx = (func)GetProcAddress(LoadLibrary("Kernel32.dll"), "GlobalMemoryStatusEx");
stMem.dwLength = sizeof(stMem);
GlobalMemoryStatusEx(&stMem);
return (FLOAT)(stMem.ullTotalPhys / ( * * 1024.0));
} DWORD GetRamProportion(void)
{
typedef BOOL(WINAPI *func)(LPMEMORYSTATUSEX);
MEMORYSTATUSEX stMem = { }; func GlobalMemoryStatusEx = (func)GetProcAddress(LoadLibrary("Kernel32.dll"), "GlobalMemoryStatusEx");
stMem.dwLength = sizeof(stMem);
GlobalMemoryStatusEx(&stMem);
return stMem.dwMemoryLoad;
} LPSTR GetSysStartTime(void)
{
LPSTR lpStr = (LPSTR)malloc(sizeof(char)* );
DWORD dwStart = GetTickCount();
DWORD day, hou, min, sec; day = dwStart / ( * * * );
hou = dwStart / ( * * ) - day * ;
min = dwStart / ( * ) - day * * - hou * ;
sec = dwStart / () - day * * * - hou * * - min * ; sprintf_s(lpStr, , "%d天%d小时%d分钟%d秒", day, hou, min, sec);
return lpStr;
} LPSTR GetSysInfo(DWORD *dwMajor, DWORD *dwMinjor, BOOL bDesc, BOOL bBit, BOOL bSPVer, BOOL bBuildVer)
{
OSVERSIONINFOEXA1 osvi = { };
SYSTEM_INFO si = { };
BOOL bWow64 = FALSE;
DWORD dwType = , dwBuild = ;
char strSys[] = { }, strVer[] = { }; osvi.dwOSVersionInfoSize = sizeof(osvi);
typedef BOOL(WINAPI *fun)(LPOSVERSIONINFOEXA1);
fun GetVersionEx1 = (fun)GetProcAddress(LoadLibrary("Kernel32.dll"), "GetVersionExA");
if (GetVersionEx1(&osvi))
{
dwBuild = osvi.dwBuildNumber;
GetSystemInfo(&si); typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS IsWow64Process1 = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process");
IsWow64Process1((void *)-, &bWow64); typedef void (WINAPI *func)(DWORD *, DWORD *, DWORD *);
func RtlGetNtVersionNumbers = (func)GetProcAddress(LoadLibrary("ntdll.dll"), "RtlGetNtVersionNumbers");
RtlGetNtVersionNumbers(&osvi.dwMajorVersion, &osvi.dwMinorVersion, &osvi.dwBuildNumber); if (dwMajor)
*dwMajor = osvi.dwMajorVersion;
if (dwMinjor)
*dwMinjor = osvi.dwMinorVersion; if (osvi.dwMajorVersion == )
{
if (osvi.dwMinorVersion == )
{
lstrcpyn(strSys, (osvi.wProductType == VER_NT_WORKSTATION ? "Windows 10" : "Windows Server 2016"), );
}
}
else if (osvi.dwMajorVersion == )
{
if (osvi.dwMinorVersion == )
{
lstrcpyn(strSys, (osvi.wProductType == VER_NT_WORKSTATION ? "Windows Vista" : "Windows Server 2008"), );
}
else if (osvi.dwMinorVersion == )
{
lstrcpyn(strSys, (osvi.wProductType == VER_NT_WORKSTATION ? "Windows 7" : "Windows Server 2008 R2"), );
}
else if (osvi.dwMinorVersion == )
{
lstrcpyn(strSys, (osvi.wProductType == VER_NT_WORKSTATION ? "Windows 8" : "Windows Server 2012"), );
}
else if (osvi.dwMinorVersion == )
{
lstrcpyn(strSys, (osvi.wProductType == VER_NT_WORKSTATION ? "Windows 8.1" : "Windows Server 2012 R2"), );
}
}
else if (osvi.dwMajorVersion == && osvi.dwMinorVersion == )
{
lstrcpyn(strSys, "Windows 2000", );
if (osvi.wProductType == )
{
lstrcpyn(strVer, "Professional", );
}
else if ((osvi.wSuiteMask & ) == )
{
lstrcpyn(strVer, "Datacenter Server", );
}
else if ((osvi.wSuiteMask & ) == )
{
lstrcpyn(strVer, "Advanced Server", );
}
else
{
lstrcpyn(strVer, "Server", );
}
}
else if (osvi.dwMajorVersion == && osvi.dwMinorVersion == )
{
lstrcpyn(strSys, "Windows XP", );
if ((osvi.wSuiteMask & ) == )
{
lstrcpyn(strVer, "Home Edition", ); // 家庭版
}
else
{
lstrcpyn(strVer, "Professional", ); // 专业版
}
}
else if (osvi.dwMajorVersion == && osvi.dwMinorVersion == )
{
if (GetSystemMetrics() != )
{
lstrcpyn(strSys, "Windows Server 2003 R2, ", );
}
else if ((osvi.wSuiteMask & ) == )
{
lstrcpyn(strSys, "Windows Storage Server 2003", );
}
else if ((osvi.wSuiteMask & ) == )
{
lstrcpyn(strSys, "Windows Home Server", );
}
else if (osvi.wProductType == && si.wProcessorArchitecture == )
{
lstrcpyn(strSys, "Windows XP Professional x64 Edition", ); // XP专业版64位系统
}
else
{
lstrcpyn(strSys, "Windows Server 2003, ", );
}
}
else if (osvi.dwMajorVersion == && osvi.dwMinorVersion == )
{
lstrcpyn(strSys, "Windows 98", );
}
else if (osvi.dwMajorVersion >= )
{
typedef BOOL(WINAPI *pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, PDWORD);
pGetProductInfo RtlGetProductInfo = (pGetProductInfo)GetProcAddress(LoadLibrary("Kernel32.dll"), "RtlGetProductInfo");
RtlGetProductInfo(osvi.dwMajorVersion, osvi.dwMinorVersion, , , &dwType); switch (dwType)
{
case : // 旗舰版
lstrcpyn(strVer, "Ultimate Edition", );
break;
case : // 家庭普通版
lstrcpyn(strVer, "Home Basic Edition", );
break;
case : // 家庭高级版
lstrcpyn(strVer, "Home Premiu Edition", );
break;
case : // 企业版
lstrcpyn(strVer, "Enterprise Edition", );
break;
case : // 商业版
lstrcpyn(strVer, "Business Edition", );
break;
case : // 服务器标准版
lstrcpyn(strVer, "Standard", );
break;
case : // 服务器企业版
lstrcpyn(strVer, "Datacenter Edition", );
break;
case : // 小型服务器
lstrcpyn(strVer, "Small Business Server", );
break;
case : // 服务器企业版(完整的安装)
lstrcpyn(strVer, "Enterprise Edition", );
break;
case : // 入门版
lstrcpyn(strVer, "Starter Edition", );
break;
case : // 服务器数据中心版(核心安装)
lstrcpyn(strVer, "Datacenter Edition (core installation)", );
break;
case : // 服务器标准版(核心安装)
lstrcpyn(strVer, "Standard Edition (core installation)", );
break;
case : // 服务器企业版(核心安装)
lstrcpyn(strVer, "Enterprise Edition (core installation)", );
break;
case : // 一个企业级的平台
lstrcpyn(strVer, "Enterprise Edition for Itanium-based Systems", );
break;
case : // 商用公司版
lstrcpyn(strVer, "Business N", );
break;
case : // Web服务器(完整安装)
lstrcpyn(strVer, "Web Server (full installation)", );
break;
case : // 服务器群集版
lstrcpyn(strVer, "HPC Edition", );
break;
case : // 2008 R2 储存服务器版
lstrcpyn(strVer, "Windows Storage Server 2008 R2 Essentials", );
break;
case : // 服务器快速储存版
lstrcpyn(strVer, "Storage Server Express", );
break;
case : // 服务器标准储存版
lstrcpyn(strVer, "Storage Server Standard", );
break;
case : // 服务器储存组
lstrcpyn(strVer, "Storage Server Workgroup", );
break;
case : // 服务器储存企业版
lstrcpyn(strVer, "Storage Server Enterprise", );
break;
case : // 小型商业服务器
lstrcpyn(strVer, "Small Business Server Premium Edition", );
break;
case : // 专业版
lstrcpyn(strVer, "Professional", );
break;
}
}
}
if (lstrlen(strSys) < )
{
sprintf_s(strSys, , "获取失败,请检查版本:%d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
return NULL;
}
else
{
LPSTR lpStr = (LPSTR)malloc(sizeof(char)* ); lstrcpyn(lpStr, strSys, lstrlenA(strSys) + );
if (bDesc)
{
lstrcatA(lpStr, " ");
lstrcatA(lpStr, strVer);
}
if (bBit)
lstrcatA(lpStr, (bWow64 ? " x64 " : " x86 "));
if (bSPVer)
lstrcatA(lpStr, (LPCSTR)&osvi.szCSDVersion);
if (bBuildVer)
sprintf_s(lpStr,, "%s,Build:%d", lpStr, dwBuild);
return lpStr;
}
return NULL;
}
效果图
C/C++获取CPU等硬件信息&&屏幕截图的更多相关文章
- Android获取cpu和内存信息、网址的代码
android获取手机cpu并判断是单核还是多核 /** * Gets the number of cores available in this device, across all proce ...
- C#获取当前主机硬件信息
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C#获取CPU等硬件ID(转载)
System.Management命名空间提供对大量管理信息和管理事件集合的访问,这些信息和事件是与根据 Windows 管理规范 (WMI) 结构对系统.设备和应用程序设置检测点有关的.应用程序和服 ...
- 获取CPU使用情况信息(转)
获取了内存使用情况,也可以使用PHP的 getrusage()获取CPU使用情况,该方法在windows下不可用. print_r(getrusage()); /* 输出 Array ( [ru ...
- 【C#】 获取计算机的硬件信息
添加引用:System.Management /// <summary> /// 获取本机的MAC地址 /// </summary> /// <returns>&l ...
- C# 获取计算机的硬件信息
/// <summary> /// 获得CPU编号 /// </summary> /// <returns></returns> public stri ...
- PowerShell 获取系统的硬件信息
1.获取系统的BIOS的信息: Get-WMIObject -Class Win32_BIOS 2.获取内存信息: Get-WMIObject -Class Win32_PhysicalMemory ...
- 使用python获取CPU和内存信息的思路与实现(linux系统)
linux里一切皆为文件,在linux/unix的根文件夹下,有个/proc文件夹,这个/proc 是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做"/proc&qu ...
- Android自动化测试-自动获取cpu和内存信息
CpuInfo.java package com.dtest; import java.io.BufferedReader; import java.io.FileWriter; import jav ...
随机推荐
- springboot vue组件写的个人博客系统
个人写的博客管理系统,学习java不到一年 欢迎探讨交流学习 https://github.com/Arsense/ssmBlog 项目地址 如果觉得好的 帮忙star一下 谢谢! 基本技术 环境: ...
- 译:面试投行的20个Java问题
原文链接:https://dzone.com/articles/var-work-in-progress 作者:Anghel Leonard 译者:沈歌 如果你需要准备面试,可以看一下这篇博客中20个 ...
- 对SNMP4J的一些封装
SNMP4J是一个开源的,用Java实现的snmp协议.其中提供了一下API,在这些API上面封装了一些方法,比如SNMP的get-request请求,get-next-request请求等 如果不了 ...
- Oracle中scott用户下基本表练习SQL语句
--选择部门中30的雇员SELECT * from emp where DEPTNO=30;--列出所有办事员的姓名.部门.编号--采用内连接方式,也就是等值链接,也是最常用的链接SELECT ena ...
- lua load
load (chunk [, chunkname [, mode [, env]]]) 加载一个代码块. 如果 chunk 是一个字符串,代码块指这个字符串. 如果 chunk 是一个函数, load ...
- webpack、babel模块、模块化
一.webpack介绍 webpack这个工具非常强大,解决了前端很繁琐的一些工具流程繁琐的事情.中文官网链接地址:https://www.webpackjs.com/ 1.为什么要使用webpack ...
- SQLAlchemy的使用---M2M增删改查
from sqlalchemy.orm import sessionmaker from sqlalchemy_M2M import engine, Girls, Boys Session = ses ...
- jq on方法绑定多个事件
一.jquery为多个选择器绑定同一个事件 $("#start,#end").on("click",function(){ alert("The pa ...
- CSS 兼容性支持
CSS 兼容性支持 在一个CSS属性还没有成为标准之前,各浏览器厂商已经做了这个属性的实现,可能各浏览器实现不尽相同,所以加入属性前缀区分. safari , chrome:-webkit- oper ...
- sheepdog