推荐使用 JetBrains Mono

Source Code Pro

到 github 找到该项目,下载该字体(所有 otf 文件)。

windows 使用 TTF文件下达文件是我们需要安装的字体。
打开TTF文件夹,将后缀名为.ttf的文件copy到C:\Windows\Fonts目录下,copy完成后,下面会出现Source Code Pro字体,windows字体归类,这就表示安装完成了。

linux 系统下载到 ~/.local/share/fonts 目录,windows 直接右键安装。

在 vscode 中选择菜单 文件->首选项->设置,在 用户设置->文本编辑器->字体->Font Family 中,头部插入 ‘Source Code Variable’, ‘Source Code Variable Italic’, 。
修改fontFamily
“editor.fontFamily”: “Source Code Variable, ‘Source Code Variable Italic’ “,
具体的字体名参照自己下的字体,同样在C:\Windows\Fonts中可以找到

lib 库接口

dumpbin /linkermember ./jemalloc.lib > 1.txt

AES加解密

#include <cryptopp/osrng.h>
#include <cryptopp/cryptlib.h>
#include <cryptopp/aes.h>
#include <cryptopp/filters.h>
#include <cryptopp/files.h>
#include <cryptopp/modes.h>
#include <cryptopp/hex.h>
using namespace CryptoPP;

#ifdef _DEBUG
#pragma comment(lib,"cryptopp/vs2015/debug/cryptlib.lib")
#else
#pragma comment(lib,"cryptopp/vs2015/release/cryptlib.lib")
#endif

unsigned char key[AES::DEFAULT_KEYLENGTH];
unsigned char iv[AES::BLOCKSIZE];

memset(key, 0x00, sizeof(key));
memset(iv, 0x00, sizeof(iv));

AutoSeededRandomPool rnd;
rnd.GenerateBlock(key, AES::DEFAULT_KEYLENGTH);

// Generate a random IV
rnd.GenerateBlock(iv, AES::BLOCKSIZE);

string strKey, strIv;
vector<char> vBuf;
byte2StrA(key, AES::DEFAULT_KEYLENGTH, vBuf);
strKey = &vBuf[0];

byte2StrA(iv, AES::BLOCKSIZE, vBuf);
strIv = &vBuf[0];


CTR_Mode<AES>::Encryption enc;
enc.SetKeyWithIV(key, sizeof(key), iv);
string encText;
StreamTransformationFilter encFilter(enc, new StringSink(encText));

string strPlain("Attack at dawn!");
//encryption
encFilter.Put((const unsigned char*)strPlain.c_str(), strPlain.size());
encFilter.MessageEnd();

// decryption
CTR_Mode<AES>::Decryption dec;
dec.SetKeyWithIV(key, sizeof(key), iv);

// conversion filter for dec
string decText;
StreamTransformationFilter decFilter(dec, new StringSink(decText));
decFilter.Put((const unsigned char*)encText.c_str(), encText.size());
encFilter.MessageEnd();

website

编译

下载源码后目录里面有 .sln 文件。

AES加解密

CTR is used if you want good parallelization (ie. speed), instead of CBC/OFB/CFB.

#include <cryptopp/osrng.h>
#include <cryptopp/cryptlib.h>
#include <cryptopp/aes.h>
#include <cryptopp/filters.h>
#include <cryptopp/files.h>
#include <cryptopp/modes.h>
#include <cryptopp/hex.h>
using namespace CryptoPP;

#ifdef _DEBUG
#pragma comment(lib,"cryptopp/vs2015/debug/cryptlib.lib")
#else
#pragma comment(lib,"cryptopp/vs2015/release/cryptlib.lib")
#endif

unsigned char key[AES::DEFAULT_KEYLENGTH];
unsigned char iv[AES::BLOCKSIZE];

memset(key, 0x00, sizeof(key));
memset(iv, 0x00, sizeof(iv));

AutoSeededRandomPool rnd;
rnd.GenerateBlock(key, AES::DEFAULT_KEYLENGTH);

// Generate a random IV
rnd.GenerateBlock(iv, AES::BLOCKSIZE);

string strKey, strIv;
vector<char> vBuf;
byte2StrA(key, AES::DEFAULT_KEYLENGTH, vBuf);
strKey = &vBuf[0];

byte2StrA(iv, AES::BLOCKSIZE, vBuf);
strIv = &vBuf[0];

// HexEncoder 返回16进制数据,没有这个返回字符串
CTR_Mode<AES>::Encryption enc;
enc.SetKeyWithIV(key, sizeof(key), iv);
string encText;
StreamTransformationFilter encFilter(enc, new HexEncoder(new StringSink(encText)));

string strPlain("Attack at dawn!");
//encryption
encFilter.Put((const unsigned char*)strPlain.c_str(), strPlain.size());
encFilter.MessageEnd();

// decryption
CTR_Mode<AES>::Decryption dec;
dec.SetKeyWithIV(key, sizeof(key), iv);

// conversion filter for dec
string decText;
StreamTransformationFilter decFilter(dec, new HexEncoder(new StringSink(decText)));
decFilter.Put((const unsigned char*)encText.c_str(), encText.size());
decFilter.MessageEnd();

对话框

资源里面添加右键菜单资源

// 头文件添加
CMenu m_menu;
NOTIFYICONDATA m_notifyData;
LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam);
void CvideoHelperDlg::OnTraymenuRestore();
void CvideoHelperDlg::OnTraymenuExit();
void CvideoHelperDlg::OnTraymenuStartService();
void CvideoHelperDlg::OnTraymenuStopService();

// 源文件添加
#define WM_TRAY_MESSAGE (WM_APP + 100)

ON_MESSAGE(WM_TRAY_MESSAGE, OnTrayNotify)
ON_COMMAND(ID_RMENU_SHOWWINDOW, &CvideoHelperDlg::OnTraymenuRestore)
ON_COMMAND(ID_RMENU_EXIT, &CvideoHelperDlg::OnTraymenuExit)
ON_COMMAND(ID_RMENU_STARTSERVICE, &CvideoHelperDlg::OnTraymenuStartService)
ON_COMMAND(ID_RMENU_STOPSERVICE, &CvideoHelperDlg::OnTraymenuStopService)

void CvideoHelperDlg::OnTraymenuRestore()
{
ShowWindow(SW_SHOW);
ShowWindow(SW_RESTORE);
Shell_NotifyIcon(NIM_DELETE, &m_notifyData);
}

void CvideoHelperDlg::OnTraymenuExit()
{
Shell_NotifyIcon(NIM_DELETE, &m_notifyData);
clean4quit();
OnOK();
}

LRESULT CvideoHelperDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
switch ((UINT)lParam)
{
case WM_LBUTTONUP:
OnTraymenuRestore();
break;
case WM_RBUTTONUP:
case WM_CONTEXTMENU:
CPoint pt;
GetCursorPos(&pt);
SetForegroundWindow();//for pop up menu but not click
//m_menu is the member of CTrayMinDlg as CMenu m_menu;
m_menu.GetSubMenu(0)->TrackPopupMenu(TPM_BOTTOMALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, this);
break;
}
return 0;
}

OnInitDialog
m_menu.LoadMenu(IDR_MENU_TRAY);
//m_bMinimized = FALSE;
ZeroMemory(&m_notifyData, sizeof(NOTIFYICONDATA));
m_notifyData.cbSize = sizeof(NOTIFYICONDATA);
m_notifyData.hWnd = this->m_hWnd;
m_notifyData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
m_notifyData.uID = IDR_MAINFRAME;
m_notifyData.uCallbackMessage = WM_TRAY_MESSAGE;
m_notifyData.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
_tcscpy_s(&m_notifyData.szTip[0], 128, TEXT("服务器程序"));

// 最小化窗口
PostMessage(WM_SYSCOMMAND, SC_MINIMIZE);

void CvideoHelperDlg::OnDestroy()
{
CDialogEx::OnDestroy();
Shell_NotifyIcon(NIM_DELETE, &m_notifyData);
}

void CvideoHelperDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);

//minimized to system tray && (FALSE == m_bMinimized)
if (nType == SIZE_MINIMIZED)
{
if (FALSE == Shell_NotifyIcon(NIM_ADD, &m_notifyData))
{
MessageBox(TEXT("Unable to set tray icon"), TEXT("Error"));
return;
}
ShowWindow(SW_HIDE);
}
}

注册表的方式会有权限问题,直接在启动目录下面创建快捷方式比较方便。


string appPath = w2s(getAppPath()) + "videoHelper.exe";
CreatLink2startupFolder(appPath,"videoHelper");

deleteLinkFromStarupFolder("videoHelper.lnk");

/*
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero (0).
*/
BOOL deleteLinkFromStarupFolder(string linkName)
{
CHAR szStartPath[MAX_PATH] = { 0 };
SHGetSpecialFolderPathA(NULL, szStartPath, CSIDL_STARTUP, 0);
string path = &szStartPath[0];
path += "\\" + linkName;
return DeleteFileA(path.c_str());
}

bool CreatLink2startupFolder(string appPath, string linkName)
{
string appName = "\\" + linkName + ".lnk";
HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
IShellLink *pisl;
hr = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pisl);
if (SUCCEEDED(hr))
{
IPersistFile* pIPF;

//这里是我们要创建快捷方式的原始文件地址
pisl->SetPath(s2w(appPath).c_str());
hr = pisl->QueryInterface(IID_IPersistFile, (void**)&pIPF);
if (SUCCEEDED(hr))
{
//这里是我们要创建快捷方式的目标地址
CHAR szStartPath[MAX_PATH] = { 0 };
SHGetSpecialFolderPathA(NULL, szStartPath, CSIDL_STARTUP, 0);
strcat_s(szStartPath,MAX_PATH, appName.c_str());

USES_CONVERSION;
LPCOLESTR lpOleStr = A2COLE(szStartPath);
pIPF->Save(lpOleStr, FALSE);
pIPF->Release();
}
pisl->Release();
}
CoUninitialize();
}

return true;
}

HKEY hKey;
//打开注册表:路径如下
//HEKY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
LSTATUS lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey);
if (lRet != ERROR_SUCCESS)
{
LPVOID message;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, lRet, NULL, (LPTSTR)&message, 0, NULL);
MessageBox((LPCTSTR)message, L"ERROR", MB_OK | MB_ICONINFORMATION);
}
//新增一个值,名称随意命名,值为要开机运行的文件的完整路径
wstring appPath = getAppPath() + L"/videoHelper.exe";
lRet = RegSetValueEx(hKey,L"videoHelper",
0, REG_EXPAND_SZ, (const BYTE*)appPath.c_str(), appPath.size()*2);
if (lRet != ERROR_SUCCESS)
{
LPVOID message;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, lRet, NULL, (LPTSTR)&message, 0, NULL);
MessageBox((LPCTSTR)message, L"ERROR", MB_OK | MB_ICONINFORMATION);
}
lRet = RegCloseKey(hKey);
if (lRet != ERROR_SUCCESS)
{
LPVOID message;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, lRet, NULL, (LPTSTR)&message, 0, NULL);
MessageBox((LPCTSTR)message, L"ERROR", MB_OK | MB_ICONINFORMATION);
}

对话框项目

// APP 里面添加互斥量
class CvideoHelperApp : public CWinApp
{
...
private:
HANDLE m_hMutex;
...
}

BOOL CvideoHelperApp::InitInstance()
{
m_hMutex = CreateMutex(NULL, TRUE, _T("注册信息"));
if (NULL == m_hMutex)
{
return FALSE;
}
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
HWND hProgramWnd = ::FindWindow(NULL, _T("注册信息"));
if (hProgramWnd)
{
WINDOWPLACEMENT* pWndpl = NULL;
WINDOWPLACEMENT wpm;
pWndpl = &wpm;
GetWindowPlacement(hProgramWnd, &wpm);
if (pWndpl)
{
//将运行的程序窗口还原成正常状态
pWndpl->showCmd = SW_SHOWNORMAL;
::SetWindowPlacement(hProgramWnd, pWndpl);
SetWindowPos(hProgramWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
}
}
CloseHandle(m_hMutex);
m_hMutex = NULL;
return FALSE;
}
...
}

// 释放资源
int CvideoHelperApp::ExitInstance()
{
if (NULL != m_hMutex)
CloseHandle(m_hMutex);
m_hMutex = NULL;

return CWinApp::ExitInstance();
}
阅读全文 »