VC++问题集10

 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);

你可能感兴趣的:(VC++问题集10)