接著昨天的折騰。
首先介紹一下 擴展名子鍵 和 類定義子鍵
擴展名子鍵由 "." + 相應擴展名構成 ,該子鍵的鍵值項的作用是指向一個“類定義子鍵”,起入口作用。 多個擴展名子鍵可以指向同一個類定義子鍵。
這樣做其實就是面向對象的思維了。
舉個例子來說,擴展名子鍵是.MP1 .MP2 .MP3
他們都指向類定義子鍵MP3FILE,那么只要定義MP3FILE里面的鍵值就可以對所有的擴展名子鍵應用了。
知道了這個概念以后我們可以實現(xiàn)用第二種方法更改關聯(lián)了:
通過 修改擴展名子鍵對應的類定義子鍵來修改關聯(lián)
舉個例子,原來.exe 默認的鍵值是 EXEFILE 說明它關聯(lián)的是EXEFILE, 如果我們將它改成TXTFILE, 自然就修改了它的關聯(lián)方式。
然后說一下今天在修改txt關聯(lián)的時候遇到的一個問題:
本來是已經成功地更改了txt關聯(lián)了,但是在恢復的時候可能把鍵值的路徑寫錯了,沒有用\\來轉義\,這個時候我打開任意一個txt文件,系統(tǒng)讓我選擇默認的打開方式。我一不小心選擇了
始終用這種方式打開 接下來就出問題了。
不管我怎么修改關聯(lián),txt文件仍然能正常打開。
于是心里猜測:在注冊表里面肯定存在著優(yōu)先于上述路徑關聯(lián)文件的打開方式,由于默認打開的關聯(lián)優(yōu)先于上述路徑的關聯(lián),所以上述路徑下(見我的上一篇文章)設置的關聯(lián)不起作用了。
自己的電腦是32的win7.在控制面板里面可以看到默認打開方式的設置:
控制面板\程序\默認程序\設置關聯(lián)
修改這里可以修改關聯(lián),但是自己推測這里在修改的時候肯定是修改了注冊表某項的關聯(lián)。自己百度了一下暫時沒有查到這個路徑的資料。明天再看看。。。。
自己本來還想修改文件夾圖標所在的注冊表鍵值,百度了一下還是沒有找到。。明天繼續(xù)看一看。。。。。。。
最后把自己寫的半成品發(fā)個上來,記錄一下。
用的是SDK的對話框模版,所以只發(fā)主要代碼:
- // MachineDialog.cpp : 定義應用程序的入口點。
- //
-
- #include "stdafx.h"
- #include "MachineDialog.h"
- #include "resource.h"
- #include <commdlg.h>
- #include <windowsx.h>
- //增加開機自啟動項
- int Add_Key(HWND hDlg, LPCTSTR filename);
- // 刪除開機自啟動項 沒有完成
- int Del_Key(HWND hDlg);
- //更改IE默認主頁
- int Change_IE_Mainpage(HWND hDlg);
- //更改exe關聯(lián)
- int Change_Exe_Rela(HWND hDlg);
- //恢復exe關聯(lián)
- int Change_Exe_Reco(HWND hDlg);
- //更改txt關聯(lián)
- int Change_Txt_Rela(HWND hDlg);
- //恢復txt關聯(lián)
- int Change_Txt_Reco(HWND hDlg);
- //禁用注冊表
- int Reg_Forbidden(HWND hDlg);
- //恢復注冊表
- int Reg_Reco(HWND hDlg);
-
- BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
-
- int APIENTRY _tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc );
- return 0;
- }
-
- BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
-
-
-
- switch (message)
- {
- case WM_INITDIALOG:
- return TRUE;
-
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDC_ADD_SECTION:
- // 設置過濾器
- OPENFILENAME ofn;
- char szFile[100];
- TCHAR szLength[50];
- ZeroMemory(&ofn,sizeof(ofn)); //memset給結構體清零
- ofn.lStructSize = sizeof(ofn);
- ofn.lpstrFile = (LPWSTR)szFile;
- ofn.lpstrFile[0] = TEXT('\0');
- ofn.nMaxFile = sizeof(szFile);
- ofn.lpstrFilter = TEXT("ALL\0*.*\0exe\0*.exe\0txt\0*.txt\0"); //過濾器設置
- ofn.nFilterIndex = 1; //默認選擇過濾器的序號
- ofn.lpstrFileTitle = NULL;
- ofn.nMaxFileTitle = 0;
- ofn.lpstrInitialDir = NULL;
- ofn.hwndOwner = hDlg; //對話框的副窗口
- ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST ;
- if (GetOpenFileName(&ofn))
- {
- TCHAR shortPath[100];
- memset(shortPath, 0, sizeof(shortPath));
- GetShortPathName((LPWSTR)szFile, (LPWSTR)shortPath, sizeof(shortPath));
- SetDlgItemText(hDlg, IDC_EDIT1, (LPWSTR)shortPath);
- Add_Key(hDlg, (LPCTSTR)shortPath);
- }
- return 0;
-
-
- case IDC_DEL_SECTION:
- //Del_Key(hDlg);
- return 0;
-
- case IDC_IE:
- Change_IE_Mainpage(hDlg);
- return 0;
-
- case IDC_EXE_RELA:
- Change_Exe_Rela(hDlg);
- return 0;
-
- case IDC_EXE_RECO:
- Change_Exe_Reco(hDlg);
- return 0;
-
- case IDC_TXT_RELA:
- Change_Txt_Rela(hDlg);
- return 0;
-
- case IDC_TXT_RECO:
- Change_Txt_Reco(hDlg);
- return 0;
-
- case IDC_REG_FORBIDDEN:
- Reg_Forbidden(hDlg);
- return 0;
-
- case IDC_REG_RECO:
- Reg_Reco(hDlg);
- return 0;
-
- case IDC_EXIT:
- EndDialog(hDlg, NULL);
-
- default:
- return 0;
- }
- }
- return FALSE;
- }
-
- int Add_Key(HWND hDlg, LPCTSTR filename)
- {
- HKEY hKey;
- LPCTSTR lpRun = L"software\\Microsoft\\Windows\\CurrentVersion\\Run";
- //打開注冊表
- long result=RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
- if(result==ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("成功打開注冊表項"), TEXT("成功"), MB_OK);
- //添加注冊表鍵值
- result=RegSetValueEx(hKey, L"greedy snake", 0, REG_SZ, (BYTE *)filename, 100);
- if (result == ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("成功添加注冊表鍵值"), TEXT("成功"), MB_OK);
- }
- else
- {
- MessageBox(hDlg, TEXT("添加注冊表鍵值失敗"), TEXT("失敗"), MB_OK);
- //printf("%d\n", result);
- }
- }
- else
- {
- MessageBox(hDlg, TEXT("打開注冊表失敗"), TEXT("失敗"), MB_OK);
- }
- RegCloseKey(hKey);
- return 0;
- }
-
- int Change_IE_Mainpage(HWND hDlg)
- {
- HKEY hKey;
- TCHAR mainpage[100];
- LPCTSTR lpRun = L"S-1-5-21-455092624-2783291490-1266880768-1000\\Software\\Microsoft\\Internet Explorer\\Main";
- GetDlgItemText(hDlg, IDC_EDIT2, mainpage, 100);
- //打開注冊表
- long result=RegOpenKeyEx(HKEY_USERS, lpRun, 0, KEY_WRITE, &hKey);
- if(result==ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("成功打開注冊表項"), TEXT("成功"), MB_OK);
- //添加注冊表鍵值
- result=RegSetValueEx(hKey, L"Start Page", 0, REG_SZ, (BYTE *)mainpage, 100);
- if (result == ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("更改IE默認主頁成功"), TEXT("成功"), MB_OK);
- }
- else
- {
- MessageBox(hDlg, TEXT("更改IE默認主頁失敗"), TEXT("失敗"), MB_OK);
- //printf("%d\n", result);
- }
- }
- else
- {
- MessageBox(hDlg, TEXT("打開注冊表失敗"), TEXT("失敗"), MB_OK);
- }
- RegCloseKey(hKey);
- return 0;
- }
-
-
- int Change_Exe_Rela(HWND hDlg)
- {
- HKEY hKey;
- TCHAR mainpage[100] = L"F:\\成品小軟件\\貪吃蛇.exe";
- LPCTSTR lpRun = L"exefile\\shell\\open\\command";
- //GetDlgItemText(hDlg, IDC_EDIT2, mainpage, 100);
- //打開注冊表
- long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey);
- if(result==ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("成功打開注冊表項"), TEXT("成功"), MB_OK);
- //添加注冊表鍵值
- result=RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)mainpage, 100);
- if (result == ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("更改exe關聯(lián)成功"), TEXT("成功"), MB_OK);
- }
- else
- {
- MessageBox(hDlg, TEXT("更改exe關聯(lián)失敗"), TEXT("失敗"), MB_OK);
- //printf("%d\n", result);
- }
- }
- else
- {
- MessageBox(hDlg, TEXT("打開注冊表失敗"), TEXT("失敗"), MB_OK);
- }
- RegCloseKey(hKey);
- return 0;
- }
-
- int Change_Exe_Reco(HWND hDlg)
- {
- HKEY hKey;
- TCHAR mainpage[100] = L"\"%1\" %*";
- LPCTSTR lpRun = L"exefile\\shell\\open\\command";
- //打開注冊表
- long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey);
- if(result==ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("成功打開注冊表項"), TEXT("成功"), MB_OK);
- //添加注冊表鍵值
- result=RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)mainpage, 100);
- if (result == ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("恢復exe關聯(lián)成功"), TEXT("成功"), MB_OK);
- }
- else
- {
- MessageBox(hDlg, TEXT("恢復exe關聯(lián)失敗"), TEXT("失敗"), MB_OK);
- //printf("%d\n", result);
- }
- }
- else
- {
- MessageBox(hDlg, TEXT("打開注冊表失敗"), TEXT("失敗"), MB_OK);
- }
- RegCloseKey(hKey);
- return 0;
- }
-
- int Change_Txt_Rela(HWND hDlg)
- {
- HKEY hKey;
- TCHAR mainpage[100] = L"C:\\Windows\\System32\\cmd.exe";
- LPCTSTR lpRun = L"txtfile\\shell\\open\\command";
- //打開注冊表
- long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey);
- if(result==ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("成功打開注冊表項"), TEXT("成功"), MB_OK);
- //添加注冊表鍵值
- result=RegSetValueEx(hKey, NULL, 0, REG_EXPAND_SZ, (BYTE *)mainpage, 100);
- if (result == ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("修改txt關聯(lián)成功"), TEXT("成功"), MB_OK);
- }
- else
- {
- MessageBox(hDlg, TEXT("修改txt關聯(lián)失敗"), TEXT("失敗"), MB_OK);
- //printf("%d\n", result);
- }
- }
- else
- {
- MessageBox(hDlg, TEXT("打開注冊表失敗"), TEXT("失敗"), MB_OK);
- }
- RegCloseKey(hKey);
- return 0;
- }
-
- int Change_Txt_Reco(HWND hDlg)
- {
- HKEY hKey;
- TCHAR mainpage[100] = L"%SystemRoot%\\system32\\NOTEPAD.EXE %1";
- LPCTSTR lpRun = L"txtfile\\shell\\open\\command";
- //打開注冊表
- long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey);
- if(result==ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("成功打開注冊表項"), TEXT("成功"), MB_OK);
- //添加注冊表鍵值
- result=RegSetValueEx(hKey, NULL, 0, REG_EXPAND_SZ, (BYTE *)mainpage, 100);
- if (result == ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("恢復txt關聯(lián)成功"), TEXT("成功"), MB_OK);
- }
- else
- {
- MessageBox(hDlg, TEXT("恢復txt關聯(lián)失敗"), TEXT("失敗"), MB_OK);
- }
- }
- else
- {
- MessageBox(hDlg, TEXT("打開注冊表失敗"), TEXT("失敗"), MB_OK);
- }
- RegCloseKey(hKey);
- return 0;
- }
-
- int Reg_Forbidden(HWND hDlg)
- {
- HKEY hKey;
- DWORD DisReg = 0x00000001;
- LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
- //打開注冊表
- long result=RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);
- if(result==ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("成功打開注冊表項"), TEXT("成功"), MB_OK);
- //添加注冊表鍵值
- result=RegSetValueEx(hKey, L"DisableRegistryTools", 0, REG_DWORD, (const BYTE *)&DisReg, sizeof(DisReg));
- if (result == ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("禁用注冊表成功"), TEXT("成功"), MB_OK);
- }
- else
- {
- MessageBox(hDlg, TEXT("禁用注冊表失敗"), TEXT("失敗"), MB_OK);
- }
- }
- else
- {
- MessageBox(hDlg, TEXT("打開注冊表失敗"), TEXT("失敗"), MB_OK);
- }
- RegCloseKey(hKey);
- return 0;
- }
-
- int Reg_Reco(HWND hDlg)
- {
- HKEY hKey;
- DWORD DisReg = 0x00000000;
- LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
- //打開注冊表
- long result=RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);
- if(result==ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("成功打開注冊表項"), TEXT("成功"), MB_OK);
- //添加注冊表鍵值
- result=RegSetValueEx(hKey, L"DisableRegistryTools", 0, REG_DWORD, (const BYTE *)&DisReg, sizeof(DisReg));
- if (result == ERROR_SUCCESS)
- {
- MessageBox(hDlg, TEXT("恢復禁用注冊表成功"), TEXT("成功"), MB_OK);
- }
- else
- {
- MessageBox(hDlg, TEXT("恢復禁用注冊表失敗"), TEXT("失敗"), MB_OK);
- }
- }
- else
- {
- MessageBox(hDlg, TEXT("打開注冊表失敗"), TEXT("失敗"), MB_OK);
- }
- RegCloseKey(hKey);
- return 0;
- }
|