📄 main.c
字号:
/**************************************************************************
tdLaunch
main.c
(C) Copyright 2001 By Tomoaki Nakashima. All right reserved.
http://www.nakka.com/
nakka@nakka.com
**************************************************************************/
/**************************************************************************
Include Files
**************************************************************************/
#define _INC_OLE
#include <windows.h>
#undef _INC_OLE
#include <Todaycmn.h>
#include <Commctrl.h>
#include <commdlg.h>
#include <aygshell.h>
#include "SelectFile.h"
#include "resource.h"
/**************************************************************************
Define
**************************************************************************/
#define WINDOW_TITLE TEXT("tdLaunch")
#define MAIN_WND_CLASS TEXT("tdLaunchWndClass")
#define REG_PATH TEXT("Software\\tdLaunch")
#define REG_FILELIST TEXT("Software\\tdLaunch\\FileList")
#define FILE_EXPLORER TEXT("fexplore.exe")
#define ID_ICON_TIMER 1
#define NUMBMP_CNT 12
#define BUF_SIZE 256
/**************************************************************************
Global Variables
**************************************************************************/
static HINSTANCE hInst;
static HWND hToolTip;
static TCHAR backbmpfile[BUF_SIZE];
static int stretch_backbmp = 0;
static int IconSize = 16;
static int HMargin = 2;
static int VMargin = 2;
static int WinLeftMargin = 0;
static int WinTopMargin = 0;
static int WinRightMargin = 13;
static int WinBottomMargin = 5;
static int ShowIconSec = 1;
static BOOL Refresh;
typedef struct _FILELIST {
TCHAR Name[BUF_SIZE];
TCHAR FileName[BUF_SIZE];
TCHAR CommnadLine[BUF_SIZE];
int Index;
} FILELIST;
static FILELIST *FileList;
static HIMAGELIST IconList;
static int FileListCnt;
static int SelItem = -1;
/******************************************************************************
DllMain
DllMain
******************************************************************************/
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD fdwReason, PVOID pvReserved)
{
hInst = hModule;
return TRUE;
}
/******************************************************************************
GetOption
愝掕偺撉傒崬傒
******************************************************************************/
static void GetOption(void)
{
HKEY hKey;
DWORD rc;
DWORD dwType;
long len;
long ret;
if(RegCreateKeyEx(HKEY_CURRENT_USER, REG_PATH, 0, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &rc) == ERROR_SUCCESS){
len = sizeof(TCHAR) * BUF_SIZE;
ret = RegQueryValueEx(hKey, TEXT("backbmpfile"), NULL, &dwType, (LPBYTE)&backbmpfile, &len);
len = sizeof(int);
ret = RegQueryValueEx(hKey, TEXT("stretch_backbmp"), NULL, &dwType, (LPBYTE)&stretch_backbmp, &len);
len = sizeof(int);
ret = RegQueryValueEx(hKey, TEXT("IconSize"), NULL, &dwType, (LPBYTE)&IconSize, &len);
len = sizeof(int);
ret = RegQueryValueEx(hKey, TEXT("HMargin"), NULL, &dwType, (LPBYTE)&HMargin, &len);
len = sizeof(int);
ret = RegQueryValueEx(hKey, TEXT("VMargin"), NULL, &dwType, (LPBYTE)&VMargin, &len);
len = sizeof(int);
ret = RegQueryValueEx(hKey, TEXT("WinLeftMargin"), NULL, &dwType, (LPBYTE)&WinLeftMargin, &len);
len = sizeof(int);
ret = RegQueryValueEx(hKey, TEXT("WinTopMargin"), NULL, &dwType, (LPBYTE)&WinTopMargin, &len);
len = sizeof(int);
ret = RegQueryValueEx(hKey, TEXT("WinRightMargin"), NULL, &dwType, (LPBYTE)&WinRightMargin, &len);
len = sizeof(int);
ret = RegQueryValueEx(hKey, TEXT("WinBottomMargin"), NULL, &dwType, (LPBYTE)&WinBottomMargin, &len);
len = sizeof(int);
ret = RegQueryValueEx(hKey, TEXT("ShowIconSec"), NULL, &dwType, (LPBYTE)&ShowIconSec, &len);
RegCloseKey(hKey);
}
}
/******************************************************************************
SetOption
愝掕偺曐懚
******************************************************************************/
static void SetOption(void)
{
HKEY hKey = 0;
DWORD rc;
//儗僕僗僩儕偵愝掕傪曐懚
if(RegCreateKeyEx(HKEY_CURRENT_USER, REG_PATH, 0, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &rc) == ERROR_SUCCESS){
RegSetValueEx(hKey, TEXT("backbmpfile"), 0, REG_SZ, (LPBYTE)backbmpfile, sizeof(TCHAR) * (lstrlen(backbmpfile) + 1));
RegSetValueEx(hKey, TEXT("stretch_backbmp"), 0, REG_DWORD, (LPBYTE)&stretch_backbmp, sizeof(int));
RegSetValueEx(hKey, TEXT("IconSize"), 0, REG_DWORD, (LPBYTE)&IconSize, sizeof(int));
RegSetValueEx(hKey, TEXT("HMargin"), 0, REG_DWORD, (LPBYTE)&HMargin, sizeof(int));
RegSetValueEx(hKey, TEXT("VMargin"), 0, REG_DWORD, (LPBYTE)&VMargin, sizeof(int));
RegSetValueEx(hKey, TEXT("WinLeftMargin"), 0, REG_DWORD, (LPBYTE)&WinLeftMargin, sizeof(int));
RegSetValueEx(hKey, TEXT("WinTopMargin"), 0, REG_DWORD, (LPBYTE)&WinTopMargin, sizeof(int));
RegSetValueEx(hKey, TEXT("WinRightMargin"), 0, REG_DWORD, (LPBYTE)&WinRightMargin, sizeof(int));
RegSetValueEx(hKey, TEXT("WinBottomMargin"), 0, REG_DWORD, (LPBYTE)&WinBottomMargin, sizeof(int));
RegSetValueEx(hKey, TEXT("ShowIconSec"), 0, REG_DWORD, (LPBYTE)&ShowIconSec, sizeof(int));
RegCloseKey(hKey);
}
}
/******************************************************************************
sort_func
僜乕僩娭悢
******************************************************************************/
static int __cdecl sort_func(const void *arg1, const void *arg2)
{
FILELIST *f1 = (FILELIST *)arg1;
FILELIST *f2 = (FILELIST *)arg2;
return f1->Index - f2->Index;
}
/******************************************************************************
CreateFileList
僼傽僀儖偺堦棗傪嶌惉
******************************************************************************/
void CreateFileList()
{
HKEY hKey = 0;
HKEY hFileKey = 0;
TCHAR buf[BUF_SIZE];
DWORD dwType;
DWORD rc;
long cnt = 0;
long len;
int i;
if(FileList != NULL){
LocalFree(FileList);
}
FileList = NULL;
FileListCnt = 0;
if(RegCreateKeyEx(HKEY_CURRENT_USER, REG_FILELIST, 0, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &rc) != ERROR_SUCCESS){
return;
}
//僒僽僉乕偺悢傪庢摼
if(RegQueryInfoKey(hKey, NULL, NULL, NULL, &cnt, NULL, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS){
return;
}
FileList = (FILELIST *)LocalAlloc(LPTR, sizeof(FILELIST) * cnt);
if(FileList == NULL){
return;
}
FileListCnt = cnt;
for(i = 0; i < cnt; i++){
len = sizeof(TCHAR) * BUF_SIZE;
if(RegEnumKeyEx(hKey, i, (FileList + i)->Name, &len, NULL, NULL, NULL, NULL) == ERROR_SUCCESS){
wsprintf(buf, TEXT("%s\\%s"), REG_FILELIST, (FileList + i)->Name);
if(RegCreateKeyEx(HKEY_CURRENT_USER, buf, 0, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hFileKey, &rc) == ERROR_SUCCESS){
len = sizeof(TCHAR) * BUF_SIZE;
RegQueryValueEx(hFileKey, TEXT("FileName"), NULL, &dwType, (LPBYTE)&((FileList + i)->FileName), &len);
RegQueryValueEx(hFileKey, TEXT("CommnadLine"), NULL, &dwType, (LPBYTE)&((FileList + i)->CommnadLine), &len);
len = sizeof(int);
RegQueryValueEx(hFileKey, TEXT("Index"), NULL, &dwType, (LPBYTE)&((FileList + i)->Index), &len);
RegCloseKey(hFileKey);
}
}
}
RegCloseKey(hKey);
if(FileListCnt > 1){
qsort(FileList, FileListCnt, sizeof(FILELIST), sort_func);
}
}
/******************************************************************************
RegDeleteFileList
僼傽僀儖偺堦棗偺嶍彍
******************************************************************************/
void RegDeleteFileList()
{
HKEY hKey = 0;
TCHAR buf[BUF_SIZE];
TCHAR SubKey[BUF_SIZE];
DWORD rc;
long len;
long cnt = 0;
int i;
//儗僕僗僩儕偺嶍彍
if(RegCreateKeyEx(HKEY_CURRENT_USER, REG_FILELIST, 0, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &rc) == ERROR_SUCCESS){
//僒僽僉乕偺悢傪庢摼
if(RegQueryInfoKey(hKey, NULL, NULL, NULL, &cnt, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS){
for(i = cnt - 1; i >= cnt; i--){
len = sizeof(TCHAR) * BUF_SIZE;
if(RegEnumKeyEx(hKey, i, SubKey, &len, NULL, NULL, NULL, NULL) == ERROR_SUCCESS){
wsprintf(buf, TEXT("%s\\%s"), REG_FILELIST, SubKey);
RegDeleteKey(HKEY_CURRENT_USER, buf);
}
}
}
RegCloseKey(hKey);
}
RegDeleteKey(HKEY_CURRENT_USER, REG_FILELIST);
}
/******************************************************************************
SaveFileList
僼傽僀儖偺堦棗傪曐懚
******************************************************************************/
void SaveFileList()
{
HKEY hKey = 0;
TCHAR buf[BUF_SIZE];
DWORD rc;
int i;
RegDeleteFileList();
for(i = 0; i < FileListCnt; i++){
wsprintf(buf, TEXT("%s\\%s"), REG_FILELIST, (FileList + i)->Name);
if(RegCreateKeyEx(HKEY_CURRENT_USER, buf, 0, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &rc) == ERROR_SUCCESS){
RegSetValueEx(hKey, TEXT("FileName"), 0, REG_SZ, (LPBYTE)((FileList + i)->FileName), sizeof(TCHAR) * (lstrlen((FileList + i)->FileName) + 1));
RegSetValueEx(hKey, TEXT("CommnadLine"), 0, REG_SZ, (LPBYTE)((FileList + i)->CommnadLine), sizeof(TCHAR) * (lstrlen((FileList + i)->CommnadLine) + 1));
RegSetValueEx(hKey, TEXT("Index"), 0, REG_DWORD, (LPBYTE)&((FileList + i)->Index), sizeof(int));
RegCloseKey(hKey);
}
}
}
/******************************************************************************
ToolTipProc
僣乕儖僠僢僾
******************************************************************************/
static BOOL CALLBACK ToolTipProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
RECT rect;
SIZE sz;
HDC hdc;
static TCHAR buf[BUF_SIZE];
switch(uMsg)
{
case WM_INITDIALOG:
break;
case WM_LBUTTONDOWN:
ShowWindow(hDlg, SW_HIDE);
break;
case WM_SETTEXT:
if(lParam == 0){
break;
}
lstrcpy(buf, (TCHAR *)lParam);
hdc = GetDC(hDlg);
GetTextExtentPoint32(hdc, buf, lstrlen(buf), &sz);
ReleaseDC(hDlg, hdc);
SetWindowPos(hDlg, 0, 0, 0, sz.cx + 6, sz.cy + 6, SWP_NOMOVE | SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE);
break;
case WM_PAINT:
hdc = BeginPaint(hDlg, &ps);
GetClientRect(hDlg,(LPRECT)&rect);
FillRect(hdc, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
ExtTextOut(hdc, 2, 2, ETO_OPAQUE, NULL, buf, lstrlen(buf), NULL);
EndPaint(hDlg, &ps);
break;
default:
return FALSE;
}
return TRUE;
}
/******************************************************************************
ImageListIconAdd
僀儊乕僕儕僗僩偵傾僀僐儞傪捛壛
******************************************************************************/
static void ImageListIconAdd(HIMAGELIST hIconList, HIMAGELIST SysIconList, int IconSize, TCHAR *path, TCHAR *File)
{
WIN32_FIND_DATA FindData;
HANDLE hFindFile;
HICON hIcon = NULL;
SHFILEINFO shfi;
TCHAR buf[BUF_SIZE];
if(path != NULL){
wsprintf(buf, TEXT("%s\\%s"), path, File);
}else{
lstrcpy(buf, File);
}
if(lstrcmp(buf, TEXT("\\")) == 0){
lstrcpy(buf, TEXT("\\windows"));
}
if((hFindFile = FindFirstFile(buf, &FindData)) != INVALID_HANDLE_VALUE){
FindClose(hFindFile);
//娭楢晅偗偝傟偨傾僀僐儞偺庢摼
SHGetFileInfo(buf, 0, &shfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX);
hIcon = ImageList_GetIcon(SysIconList, shfi.iIcon, ILD_NORMAL);
}
if(hIcon == NULL){
//傾僾儕働乕僔儑儞傾僀僐儞偺庢摼
hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_NON));
}
//僀儊乕僕儕僗僩偵傾僀僐儞傪捛壛
ImageList_AddIcon(hIconList, hIcon);
DestroyIcon(hIcon);
}
/******************************************************************************
SetImegeListIcon
僀儊乕僕儕僗僩傪愝掕
******************************************************************************/
BOOL SetImegeListIcon(FILELIST *FileList, int IconCnt, int IconSize)
{
HIMAGELIST SysIconList;
SHFILEINFO shfi;
HICON hIcon = NULL;
int size;
int i;
//僀儊乕僕儕僗僩偺嶌惉
if(IconList != NULL){
ImageList_Destroy((void *)IconList);
IconList = NULL;
}
//僔僗僥儉僀儊乕僕儕僗僩偺庢摼
SysIconList = (HIMAGELIST)SHGetFileInfo(TEXT(""), 0, &shfi, sizeof(SHFILEINFO),
SHGFI_ICON | ((IconSize < 24) ? SHGFI_SMALLICON : 0) | SHGFI_SYSICONINDEX);
if(SysIconList == NULL){
return FALSE;
}
size = ((IconSize < 24) ? 16 : 32);
IconList = ImageList_Create(size, size, ILC_COLOR | ILC_MASK, IconCnt, IconCnt);
//僼傽僀儖傾僀僐儞偺捛壛
for(i = 0; i < IconCnt; i++){
ImageListIconAdd(IconList, SysIconList, IconSize, NULL, (FileList + i)->FileName);
}
return TRUE;
}
/******************************************************************************
_ImageList_DrawEx
僀儊乕僕儕僗僩偺傾僀僐儞傪昤夋
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -