📄 main.cpp
字号:
return (setDriverData(&cmiTopologyDev) && setCurrentChannelConfig());
}
BOOL initDialog(HWND hWnd)
{
HICON hIcon;
TC_ITEM tci;
int i;
hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_APP_ICON));
SendMessage(hWnd, WM_SETICON, (LPARAM) ICON_BIG, (WPARAM) hIcon);
hURLFont = 0;
hWndTab = GetDlgItem(hWnd,IDC_TAB);
ZeroMemory(&tci, sizeof(TC_ITEM));
tci.mask = TCIF_TEXT;
for (i=0;i<NUM_TABS;i++) {
tci.pszText = tabsName[i];
if (TabCtrl_InsertItem(hWndTab, i, &tci) == -1) {
PrintLastError("TabCtrl_InsertItem()");
return FALSE;
}
hWndChild[i] = CreateDialogParam(hInst, MAKEINTRESOURCE(tabsResource[i]), hWndTab, (DLGPROC)TabDlgProc, 0);
}
hURLFont = CreateFont(20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, VARIABLE_PITCH | FF_SWISS, "MS Shell Dlg");
SendMessage(GetDlgItem(hWndChild[NUM_TABS-1], IDC_URL2), WM_SETFONT, (WPARAM)hURLFont, TRUE);
currentTab = 0;
ShowWindow(hWndChild[0], SW_SHOWDEFAULT);
if (!openDevice()) {
PrintLastError("openDevice()");
return FALSE;
}
return setDlgItems(hWnd);
}
BOOL changeTab(LPNMHDR lpnmhdr)
{
if (lpnmhdr->code != TCN_SELCHANGE) {
return FALSE;
}
ShowWindow(hWndChild[currentTab], SW_HIDE);
currentTab = SendMessage(hWndTab, TCM_GETCURSEL, 0, 0);
ShowWindow(hWndChild[currentTab], SW_SHOWDEFAULT);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg) {
case WM_INITDIALOG:
if (!initDialog(hWnd)) {
PostQuitMessage(0);
}
return TRUE;
case WM_CLOSE:
DestroyWindow(hWnd);
return TRUE;
case WM_NOTIFY:
return changeTab((LPNMHDR)lParam);
case WM_DESTROY:
cleanUp();
PostQuitMessage(0);
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDB_CLOSE) {
PostQuitMessage(0);
return TRUE;
}
if (LOWORD(wParam) == IDB_APPLY) {
applySettings();
setDlgItems(hWnd);
return TRUE;
}
break;
}
return 0;
}
void openURL(int control)
{
char buffer[127];
GetWindowText(GetDlgItem(hWndChild[3], control), buffer, sizeof(buffer));
ShellExecute(hWndMain, "open", buffer, NULL, NULL, SW_SHOWNORMAL);
}
LRESULT CALLBACK TabDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg) {
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDB_STARTSTOP:
if (stopTestTone()) {
SetDlgItemText(hWndChild[0], IDB_STARTSTOP, "&Start");
return TRUE;
}
if (playTestTone()) {
SetDlgItemText(hWndChild[0], IDB_STARTSTOP, "&Stop");
return TRUE;
}
break;
case IDC_URL1:
case IDC_URL2:
openURL(LOWORD(wParam));
break;
}
case WM_CTLCOLORSTATIC:
if ( (GetDlgItem(hWndChild[3], IDC_URL1) == (HANDLE)lParam) || (GetDlgItem(hWndChild[3], IDC_URL2) == (HANDLE)lParam) ) {
SetTextColor((HDC)wParam, 0xFF0000);
SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
}
}
return 0;
}
void printUsage()
{
unsigned char usage[] = "/h - print this help message\r\n" \
"/enable71Mode - change channel configuration to 7.1\r\n" \
"/enable51Mode - change channel configuration to 5.1\r\n" \
"/enable40Mode - change channel configuration to 4.0 (Quad)\r\n" \
"/enable20Mode - change channel configuration to 2.0 (Stereo)\r\n" \
"/enableSPDIFo - enable SPDIF-out\r\n" \
"/disableSPDIFo - disable SPDIF-out\r\n"\
"/enableSPDIFi - enable SPDIF-in recording\r\n" \
"/disableSPDIFi - disable SPDIF-in recording\r\n";
MessageBox(NULL, (LPCSTR)usage, TEXT("Usage Help"), MB_ICONINFORMATION | MB_OK);
return;
}
void deleteDriverFiles() {
TCHAR SysDir[MAX_PATH];
unsigned int len;
if (GetSystemDirectory(SysDir, sizeof(SysDir))==0) {
PrintLastError("GetSystemDirectory()");
return;
}
len = strlen(SysDir);
strcat(SysDir, "\\cmicpl.cpl");
if (!DeleteFile(SysDir)) {
MoveFileEx(SysDir, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
}
SysDir[len] = 0;
strcat(SysDir, "\\cmicontrol.exe");
if (!DeleteFile(SysDir)) {
MoveFileEx(SysDir, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
}
}
void performUninstall() {
deleteDriverFiles();
RegDeleteKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\CMIDriver");
MessageBox(NULL, "The CMI driver applications were successfully removed from your computer!", "CMIDriver", MB_ICONINFORMATION);
ExitProcess(0);
}
bool checkToken(char* token) {
if ((strcmp(token, "?")==0) || (strcmp(token, "H")==0)) {
printUsage();
return TRUE;
} else
if (strcmp(token, "ENABLE71MODE")==0) {
currentChannelCount = 8;
} else
if (strcmp(token, "ENABLE51MODE")==0) {
currentChannelCount = 6;
} else
if ((strcmp(token, "ENABLE40MODE")==0) || (strcmp(token, "ENABLEQUADMODE")==0) || (strcmp(token, "QUAD")==0) ) {
currentChannelCount = 4;
} else
if ((strcmp(token, "ENABLE20MODE")==0) || (strcmp(token, "ENABLESTEREOMODE")==0) || (strcmp(token, "STEREO")==0) ) {
currentChannelCount = 2;
} else
if (strcmp(token, "ENABLESPDIFO")==0) {
cmiData.enableSPDO = TRUE;
} else
if (strcmp(token, "DISABLESPDIFO")==0) {
cmiData.enableSPDO = FALSE;
} else
if (strcmp(token, "ENABLESPDIFI")==0) {
cmiData.enableSPDI = TRUE;
} else
if (strcmp(token, "DISABLESPDIFI")==0) {
cmiData.enableSPDI = FALSE;
} else
if (strcmp(token, "UNINSTALL")==0) {
performUninstall();
}
return FALSE;
}
int parseArguments(LPSTR szCmdLine) {
BOOL inToken = false;
int i = 0, j;
char token[MAX_TOKEN_SIZE];
if (!openDevice()) {
return FALSE;
}
if (!getDriverData(&cmiTopologyDev)) {
PrintLastError("getDriverData()");
return FALSE;
}
if (!getCurrentChannelConfig()) {
PrintLastError("getCurrentChannelConfig()");
return FALSE;
}
while (szCmdLine[i]) {
if (inToken) {
if (szCmdLine[i] == ' ') {
inToken = false;
token[j] = 0;
if (checkToken(token)) {
return TRUE;
}
} else {
token[j] = (char)toupper(szCmdLine[i]);
if (j < MAX_TOKEN_SIZE-1) {
j++;
}
}
} else {
if ((szCmdLine[i] == '-') || (szCmdLine[i] == '/')) {
j = 0;
inToken = true;
}
}
i++;
}
token[j] = 0;
checkToken(token);
return (setDriverData(&cmiTopologyDev) && setCurrentChannelConfig());
}
void InitURLControl()
{
WNDCLASSEX wce;
ZeroMemory(&wce, sizeof(wce));
wce.cbSize = sizeof(WNDCLASSEX);
if (GetClassInfoEx(hInst, "Static", &wce)==0) {
PrintLastError("GetClassInfoEx()");
return;
}
wce.hCursor = LoadCursor(NULL, IDC_HAND);
wce.hInstance = hInst;
wce.lpszClassName = "URLLink";
if (RegisterClassEx(&wce) == 0) {
PrintLastError("RegisterClassEx()");
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
WNDCLASSEX wce;
MSG msg;
ZeroMemory(&cmiData, sizeof(CMIDATA));
ZeroMemory(&cmiTopologyDev, sizeof(CMIDEV));
hWave = NULL;
if (szCmdLine) {
if (strlen(szCmdLine) > 0) {
int result = parseArguments(szCmdLine);
cleanUp();
return result;
}
}
if (hWndMain = FindWindow("cmiControlPanel", NULL)) {
SetForegroundWindow(hWndMain);
return FALSE;
}
hInst = hInstance;
InitCommonControls();
CoInitialize(NULL);
ZeroMemory(&wce, sizeof(WNDCLASSEX));
wce.cbSize = sizeof(WNDCLASSEX);
wce.lpfnWndProc = DefDlgProc;
wce.style = 0;
wce.cbWndExtra = DLGWINDOWEXTRA;
wce.hInstance = hInstance;
wce.hCursor = LoadCursor(NULL, IDC_ARROW);
wce.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wce.lpszClassName = "cmiControlPanel";
wce.lpszMenuName = NULL;
wce.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
wce.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
if(!RegisterClassEx(&wce)) {
PrintLastError("RegisterClassEx()");
return -1;
}
InitURLControl();
hWndMain = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC)WndProc, NULL);
if (!hWndMain) {
PrintLastError("CreateDialogParam()");
return -1;
}
while (GetMessage(&msg, (HWND) NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -