⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 Windows Mobile好用的今日桌面插件,在桌面插入一个Item项
💻 C
📖 第 1 页 / 共 3 页
字号:
/**************************************************************************

	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 + -