101.如何隐藏、显示Windows任务栏?
这方法和100问一样,这里我们用SetWindowPos方法。具体示例如下:
HWND tray=::FindWindow("Shell_traywnd",NULL);
if(tray!=NULL)
{
::SetWindowPos(tray,HWND_TOPMOST,0,0,0,0,SWP_SHOWWINDOW);
}
102.Windows和Systems文件夹是系统特殊的文件夹,主要用于存放系统文件,系统中有环境变量指向这
两个文件夹,应用程序在系统的任何路径下都能访问这两个文件夹下的文件,在开发应用程序
时也要向2这两个文件夹里复制文件。
介绍两个函数:GetWindowsDirectory和GetSystemDirectory函数。
GetWindowsDirectory函数用于获得Windows文件夹路径名,语法如下:
UINT GetWindowsDirectory(
LPTSTR lpBuffer, // address of buffer for Windows directory
//存放Windows文件夹路径名的缓冲区
UINT uSize // size of directory buffer
//缓冲区大小
);
UINT GetSystemDirectory(//函数用于获得system文件夹路径名
LPTSTR lpBuffer, // address of buffer for system directory
//存放System文件夹路径名的缓冲区
UINT uSize // size of directory buffer
//缓冲区大小
);
103.如何启动控制面板?
调用控制面板相关的设置对话框主要是执行rundll32.exe程序。例如打开IE设置窗口,可以
选择"开始"--"运行"菜单命令,在"打开"文本框中输入"rundll32.exe shell32.dll
Control_RunDLL inetcpl.cpl"语句。
所以我们可以使用:ShellExecute函数。
HINSTANCE ShellExecute(
HWND hwnd, //应用程序窗体句柄
LPCTSTR lpOperation,//具体操作命令,如open print explore
LPCTSTR lpFile, //其他应用程序文件名
LPCTSTR lpParameters, //应用程序调用的参数
LPCTSTR lpDirectory,//默认的目录地址
INT nShowCmd//窗体显示参数,如SW_SHOW
);
如下为示例代码:
//打开 IE4 的设置窗口
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL inetcpl.cpl",NULL,SW_SHOW);
附:
//打开 声音的设置窗口
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL mmsys.cpl @1",NULL,SW_SHOW);
//启动日期和时间设置
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL timedate.cpl",NULL,SW_SHOW);
//启动显示设置面板
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL desk.cpl",NULL,SW_SHOW);
//启动辅助选项
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL access.cpl",NULL,SW_SHOW);
//打开鼠标设置
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL main.cpl @0",NULL,SW_SHOW);
//启动键盘设置
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL main.cpl @1",NULL,SW_SHOW);
//打开区域设置
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL intl.cpl",NULL,SW_SHOW);
//启动添加软件设置
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL appwiz.cpl",NULL,SW_SHOW);
//启动添加硬件设置
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL hdwwiz.cpl",NULL,SW_SHOW);
//打开系统设置
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL sysdm.cpl",NULL,SW_SHOW);
//启动调制解调器设置
::ShellExecute(NULL,"OPEN","rundll32.exe",
"shell32.dll Control_RunDLL modem.cpl",NULL,SW_SHOW);
104.如何为程序添加快捷键?
通过RegisterHotKey函数可以将用户的键盘消息转换成用户自定义消息。
BOOL RegisterHotKey(
HWND hWnd, // window to receive hot-key notification
int id, // identifier of hot key
UINT fsModifiers, // key-modifier flags
UINT vk // virtual-key code
);
如果要取消注册的热键则调用UnregisterHotKey函数。
105.如何创建桌面快捷方式和菜单快捷方式:
如下示例代码:
创建桌面快捷方式:
if(strname.IsEmpty())return;
IShellLink *link;
IPersistFile *file;
HRESULT res=::CoCreateInstance(CLSID_ShellLink,NULL,
CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&link);
if(FAILED(res))
return;
link->SetPath(pathname);
res=link->QueryInterface(IID_IPersistFile,(void**)&file);
if(FAILED(res))
return;
WORD wsz[MAX_PATH];
CString linkname;
LPITEMIDLIST pid;
char path[MAX_PATH];
::SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&pid);
::SHGetPathFromIDList(pid,path);
CString name;
int pos=strname.Find(".");
name=strname.Left(pos);
linkname.Format("%s//%s.lnk",path,name);
MultiByteToWideChar(CP_ACP,0,linkname,-1,wsz,MAX_PATH);
file->Save(wsz,STGM_READWRITE);
file->Release();
link->Release();
::SHChangeNotify(SHCNE_CREATE|SHCNE_INTERRUPT,SHCNF_FLUSH|SHCNF_PATH,linkname,0);
::SHChangeNotify(SHCNE_UPDATEDIR|SHCNE_INTERRUPT,
SHCNF_FLUSH|SHCNF_PATH,path,0);
创建菜单快捷方式:
if(strname.IsEmpty())return;
IShellLink *link;
IPersistFile *file;
HRESULT res=::CoCreateInstance(CLSID_ShellLink,NULL,
CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&link);
if(FAILED(res))
return;
link->SetPath(pathname);
res=link->QueryInterface(IID_IPersistFile,(void**)&file);
if(FAILED(res))
return;
WORD wsz[MAX_PATH];
CString linkname;
LPITEMIDLIST pid;
char path[MAX_PATH];
::SHGetSpecialFolderLocation(NULL,CSIDL_PROGRAMS,&pid);
::SHGetPathFromIDList(pid,path);
CString name;
int pos=strname.Find(".");
name=strname.Left(pos);
linkname.Format("%s//%s.lnk",path,name);
MultiByteToWideChar(CP_ACP,0,linkname,-1,wsz,MAX_PATH);
file->Save(wsz,STGM_READWRITE);
file->Release();
link->Release();
::SHChangeNotify(SHCNE_CREATE|SHCNE_INTERRUPT,SHCNF_FLUSH|SHCNF_PATH,linkname,0);
::SHChangeNotify(SHCNE_UPDATEDIR|SHCNE_INTERRUPT,
SHCNF_FLUSH|SHCNF_PATH,path,0);
106.检测系统启动模式。
我们可以通过GetSystemMetrics函数来得到系统启动模式的参数。
示例代码如下:
int i=::GetSystemMetrics(SM_CLEANBOOT);
switch(i)
{
case 0:
GetDlgItem(IDC_EDSTARTMODE)->SetWindowText("正常启动");
break;
case 1:
GetDlgItem(IDC_EDSTARTMODE)->SetWindowText("安全模式");
break;
}
107.如何获取计算机内存使用状态?
我们可以通过GlobalMemoryStatus函数来获得内存使用情况。
示例代码如下:
MEMORYSTATUS memory;
CString strmem;
::GlobalMemoryStatus(&memory);
strmem.Format("%dK",memory.dwTotalPhys/1024);
GetDlgItem(IDC_EDPHYTOTAL)->SetWindowText(strmem);
strmem.Format("%dK",memory.dwAvailPhys/1024);
GetDlgItem(IDC_EDPHYFREE)->SetWindowText(strmem);
strmem.Format("%dK",memory.dwTotalVirtual/1024);
GetDlgItem(IDC_EDVIRTOTAL)->SetWindowText(strmem);
strmem.Format("%dK",memory.dwAvailVirtual/1024);
GetDlgItem(IDC_EDVIRFREE)->SetWindowText(strmem);
108.监视剪切板内容:
先打开剪切板
view=SetClipboardViewer();
将剪切板中的数据类型添加到列表中
m_list.ResetContent();
if(OpenClipboard())
{
UINT i=0;
while(i=EnumClipboardFormats(i))
{
CString str;
str=GetName(i);
m_list.AddString(str);
}
}
获取剪切板中的数据
if(IsClipboardFormatAvailable(CF_TEXT))
{
HANDLE handle=GetClipboardData(CF_TEXT);
char*data=(char*)GlobalLock(handle);
CString str=data;
GetDlgItem(IDC_EDBODY)->SetWindowText(str);
}
最后关闭剪切板
ChangeClipboardChain(view);
109.剪切板中的数据类型:
1:CF_TEXT
2:CF_BITMAP
3:CF_METAFILEPICT
4:CF_SYLK
5:CF_DIF
6:CF_TIFF
7:CF_OEMTEXT
8:CF_DIB
9:CF_PALETTE
10:CF_PENDATA
11:CF_RIFF
12:CF_WAVE
13:CF_UNICODETEXT
14:CF_ENHMETAFILE
15:CF_HDROP
16:CF_LOCALE
17:CF_MAX
0x0080:CF_OWNERDISPLAY
0x0081:CF_DSPTEXT
0x0082:CF_DSPBITMAP
0x0083:CF_DSPMETAFILEPICT
0x008E:CF_DSPENHMETAFILE
0x0200:CF_PRIVATEFIRST
0x02FF:CF_PRIVATELAST
0x0300:CF_GDIOBJFIRST
0x03FF:CF_GDIOBJLAST
110.利用钩子技术实现键盘监控。
我们可以通过SetWindowsHookEx函数实现,该函数主要用来启动钩子,语法如下:
HHOOK SetWindowsHookEx(
int idHook, // type of hook to install
//指定钩子的类型。
HOOKPROC lpfn, // address of hook procedure
//钩子事件触发时调用的回调函数
HINSTANCE hMod, // handle to application instance
//包含回调函数的动态连接库文件的句柄
DWORD dwThreadId // identity of thread to install hook for
//钩子函数所以监控的应用程序进程号。如果为0则监控所有进程
);
卸载钩子调用UnhookWindowsHookEx函数。
示例代码如下:
hKeyHook=SetWindowsHookEx(WH_KEYBOARD,
(HOOKPROC)KeyHook,(HINSTANCE)AfxGetApp()->m_hInstance,0);