<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>VC++技术</title><link>http://blog.vckbase.com/jim97/category/776.html</link><description>VC++技术</description><managingEditor>木子的blog</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>木子的blog</dc:creator><title>深入浅出ShellExecute 应用实例</title><link>http://blog.vckbase.com/jim97/articles/14994.html</link><pubDate>Thu, 17 Nov 2005 05:32:00 GMT</pubDate><guid>http://blog.vckbase.com/jim97/articles/14994.html</guid><wfw:comment>http://blog.vckbase.com/jim97/comments/14994.html</wfw:comment><comments>http://blog.vckbase.com/jim97/articles/14994.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/jim97/comments/commentRss/14994.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jim97/services/trackbacks/14994.html</trackback:ping><description>&lt;DIV style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word" onload="this.style.overflowX='auto';"&gt;&lt;BR&gt;Q: 如何打开一个应用程序？&lt;BR&gt;ShellExecute(this-&amp;gt;m_hWnd,"open","calc.exe","","", SW_SHOW );&lt;BR&gt;或&lt;BR&gt;ShellExecute(this-&amp;gt;m_hWnd,"open","notepad.exe",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"c:\\MyLog.log","",SW_SHOW );&lt;BR&gt;As you can see, I haven't passed the full path of the programs. &lt;BR&gt;Q: 如何打开一个同系统程序相关连的文档？&lt;BR&gt;ShellExecute(this-&amp;gt;m_hWnd,"open",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"c:\\abc.txt","","",SW_SHOW );&lt;BR&gt;Q: 如何打开一个网页？&lt;BR&gt;ShellExecute(this-&amp;gt;m_hWnd,"open",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"http://www.google.com","","", SW_SHOW );&lt;BR&gt;Q: 如何激活相关程序，发送EMAIL？&lt;BR&gt;ShellExecute(this-&amp;gt;m_hWnd,"open",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"mailto:nishinapp@yahoo.com","","", SW_SHOW );&lt;BR&gt;Q: 如何用系统打印机打印文档？&lt;BR&gt;ShellExecute(this-&amp;gt;m_hWnd,"print",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"c:\\abc.txt","","", SW_HIDE);&lt;BR&gt;Q: 如何用系统查找功能来查找指定文件？&lt;BR&gt;ShellExecute(m_hWnd,"find","d:\\nish",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL,NULL,SW_SHOW);&lt;BR&gt;Q: 如何启动一个程序，直到它运行结束？&lt;BR&gt;SHELLEXECUTEINFO ShExecInfo = {0};&lt;BR&gt;ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);&lt;BR&gt;ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;&lt;BR&gt;ShExecInfo.hwnd = NULL;&lt;BR&gt;ShExecInfo.lpVerb = NULL;&lt;BR&gt;ShExecInfo.lpFile = "c:\\MyProgram.exe";&amp;nbsp;&amp;nbsp;&lt;BR&gt;ShExecInfo.lpParameters = "";&amp;nbsp;&lt;BR&gt;ShExecInfo.lpDirectory = NULL;&lt;BR&gt;ShExecInfo.nShow = SW_SHOW;&lt;BR&gt;ShExecInfo.hInstApp = NULL;&amp;nbsp;&lt;BR&gt;ShellExecuteEx(&amp;amp;ShExecInfo);&lt;BR&gt;WaitForSingleObject(ShExecInfo.hProcess,INFINITE);&lt;BR&gt;或：&lt;BR&gt;PROCESS_INFORMATION ProcessInfo; &lt;BR&gt;STARTUPINFO StartupInfo; //This is an [in] parameter&lt;BR&gt;ZeroMemory(&amp;amp;StartupInfo, sizeof(StartupInfo));&lt;BR&gt;StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field&lt;BR&gt;if(CreateProcess("c:\\winnt\\notepad.exe", NULL, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL,NULL,FALSE,0,NULL,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL,&amp;amp;StartupInfo,&amp;amp;ProcessInfo))&lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WaitForSingleObject(ProcessInfo.hProcess,INFINITE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CloseHandle(ProcessInfo.hThread);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CloseHandle(ProcessInfo.hProcess);&lt;BR&gt;}&amp;nbsp;&amp;nbsp;&lt;BR&gt;else&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox("The process could not be started...");&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;Q: 如何显示文件或文件夹的属性？&lt;BR&gt;SHELLEXECUTEINFO ShExecInfo ={0};&lt;BR&gt;ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);&lt;BR&gt;ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;&lt;BR&gt;ShExecInfo.hwnd = NULL;&lt;BR&gt;ShExecInfo.lpVerb = "properties";&lt;BR&gt;ShExecInfo.lpFile = "c:\\"; //can be a file as well&lt;BR&gt;ShExecInfo.lpParameters = ""; &lt;BR&gt;ShExecInfo.lpDirectory = NULL;&lt;BR&gt;ShExecInfo.nShow = SW_SHOW;&lt;BR&gt;ShExecInfo.hInstApp = NULL; &lt;BR&gt;ShellExecuteEx(&amp;amp;ShExecInfo);&lt;/DIV&gt;&lt;img src ="http://blog.vckbase.com/jim97/aggbug/14994.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>木子的blog</dc:creator><title>在VC++中对float或double型数字格式化方法</title><link>http://blog.vckbase.com/jim97/articles/12140.html</link><pubDate>Thu, 15 Sep 2005 08:51:00 GMT</pubDate><guid>http://blog.vckbase.com/jim97/articles/12140.html</guid><wfw:comment>http://blog.vckbase.com/jim97/comments/12140.html</wfw:comment><comments>http://blog.vckbase.com/jim97/articles/12140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/jim97/comments/commentRss/12140.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jim97/services/trackbacks/12140.html</trackback:ping><description>&lt;P&gt;采用中间变量字符串来进行格式化后，才返回&lt;BR&gt;float ftemp=12.093444;&lt;BR&gt;CString str;&lt;BR&gt;&amp;nbsp;&amp;nbsp;str.Format("%.3f",ftemp); &lt;BR&gt;&amp;nbsp;&amp;nbsp;ftemp=atof(str);&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/jim97/aggbug/12140.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>木子的blog</dc:creator><title>VC常用数据类型使用转换详解</title><link>http://blog.vckbase.com/jim97/articles/11827.html</link><pubDate>Sat, 03 Sep 2005 08:10:00 GMT</pubDate><guid>http://blog.vckbase.com/jim97/articles/11827.html</guid><wfw:comment>http://blog.vckbase.com/jim97/comments/11827.html</wfw:comment><comments>http://blog.vckbase.com/jim97/articles/11827.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.vckbase.com/jim97/comments/commentRss/11827.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jim97/services/trackbacks/11827.html</trackback:ping><description>我们先定义一些常见类型变量借以说明 &lt;BR&gt;&lt;BR&gt;int i = 100; &lt;BR&gt;long l = 2001; &lt;BR&gt;float f=300.2; &lt;BR&gt;double d=12345.119; &lt;BR&gt;char username[]="程佩君"; &lt;BR&gt;char temp[200]; &lt;BR&gt;char *buf; &lt;BR&gt;CString str; &lt;BR&gt;_variant_t v1; &lt;BR&gt;_bstr_t v2; &lt;BR&gt;&lt;BR&gt;一、其它数据类型转换为字符串 &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;短整型(int) &lt;BR&gt;itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制 &lt;BR&gt;itoa(i,temp,2); ///按二进制方式转换 &lt;BR&gt;长整型(long) &lt;BR&gt;ltoa(l,temp,10); &lt;BR&gt;浮点数(float,double) &lt;BR&gt;用fcvt可以完成转换,这是MSDN中的例子: &lt;BR&gt;int decimal, sign; &lt;BR&gt;char *buffer; &lt;BR&gt;double source = 3.1415926535; &lt;BR&gt;buffer = _fcvt( source, 7, &amp;amp;decimal, &amp;amp;sign ); &lt;BR&gt;运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0 &lt;BR&gt;decimal表示小数点的位置,sign表示符号:0为正数，1为负数 &lt;BR&gt;CString变量 &lt;BR&gt;str = "2008北京奥运"; &lt;BR&gt;buf = (LPSTR)(LPCTSTR)str; &lt;BR&gt;BSTR变量 &lt;BR&gt;BSTR bstrValue = ::SysAllocString(L"程序员"); &lt;BR&gt;char * buf = _com_util::ConvertBSTRToString(bstrValue); &lt;BR&gt;SysFreeString(bstrValue); &lt;BR&gt;AfxMessageBox(buf); &lt;BR&gt;delete(buf); &lt;BR&gt;CComBSTR变量 &lt;BR&gt;CComBSTR bstrVar("test"); &lt;BR&gt;char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str); &lt;BR&gt;AfxMessageBox(buf); &lt;BR&gt;delete(buf); &lt;BR&gt;&lt;BR&gt;_bstr_t变量 &lt;BR&gt;_bstr_t类型是对BSTR的封装，因为已经重载了=操作符，所以很容易使用 &lt;BR&gt;_bstr_t bstrVar("test"); &lt;BR&gt;const char *buf = bstrVar;///不要修改buf中的内容 &lt;BR&gt;AfxMessageBox(buf); &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;通用方法(针对非COM数据类型) &lt;BR&gt;用sprintf完成转换 &lt;BR&gt;char&amp;nbsp;&amp;nbsp;buffer[200]; &lt;BR&gt;char&amp;nbsp;&amp;nbsp;c = '1'; &lt;BR&gt;int&amp;nbsp;&amp;nbsp; i = 35; &lt;BR&gt;long&amp;nbsp;&amp;nbsp;j = 1000; &lt;BR&gt;float f = 1.7320534f; &lt;BR&gt;sprintf( buffer, "%c",c); &lt;BR&gt;sprintf( buffer, "%d",i); &lt;BR&gt;sprintf( buffer, "%d",j); &lt;BR&gt;sprintf( buffer, "%f",f); &lt;BR&gt;&lt;BR&gt;二、字符串转换为其它数据类型 &lt;BR&gt;strcpy(temp,"123"); &lt;BR&gt;&lt;BR&gt;短整型(int) &lt;BR&gt;i = atoi(temp); &lt;BR&gt;长整型(long) &lt;BR&gt;l = atol(temp); &lt;BR&gt;浮点(double) &lt;BR&gt;d = atof(temp); &lt;BR&gt;CString变量 &lt;BR&gt;CString name = temp; &lt;BR&gt;BSTR变量 &lt;BR&gt;BSTR bstrValue = ::SysAllocString(L"程序员"); &lt;BR&gt;...///完成对bstrValue的使用 &lt;BR&gt;SysFreeString(bstrValue); &lt;BR&gt;&lt;BR&gt;CComBSTR变量 &lt;BR&gt;CComBSTR类型变量可以直接赋值 &lt;BR&gt;CComBSTR bstrVar1("test"); &lt;BR&gt;CComBSTR bstrVar2(temp); &lt;BR&gt;&lt;BR&gt;_bstr_t变量 &lt;BR&gt;_bstr_t类型的变量可以直接赋值 &lt;BR&gt;_bstr_t bstrVar1("test"); &lt;BR&gt;_bstr_t bstrVar2(temp); &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;三、其它数据类型转换到CString &lt;BR&gt;使用CString的成员函数Format来转换,例如: &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;整数(int) &lt;BR&gt;str.Format("%d",i); &lt;BR&gt;浮点数(float) &lt;BR&gt;str.Format("%f",i); &lt;BR&gt;字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值 &lt;BR&gt;str = username; &lt;BR&gt;对于Format所不支持的数据类型，可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *，然后赋值给CString变量。 &lt;BR&gt;&lt;BR&gt;四、BSTR、_bstr_t与CComBSTR &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;CComBSTR 是ATL对BSTR的封装，_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。 &lt;BR&gt;char *转换到BSTR可以这样: &lt;BR&gt;BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上comutil.h和comsupp.lib &lt;BR&gt;SysFreeString(bstrValue); &lt;BR&gt;反之可以使用 &lt;BR&gt;char *p=_com_util::ConvertBSTRToString(b); &lt;BR&gt;delete p; &lt;BR&gt;具体可以参考一，二段落里的具体说明。 &lt;BR&gt;&lt;BR&gt;CComBSTR与_bstr_t对大量的操作符进行了重载，可以直接进行=,!=,==等操作，所以使用非常方便。 &lt;BR&gt;特别是_bstr_t,建议大家使用它。 &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;五、VARIANT 、_variant_t 与 COleVariant &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。 &lt;BR&gt;对于VARIANT变量的赋值：首先给vt成员赋值，指明数据类型，再对联合结构中相同数据类型的变量赋值，举个例子： &lt;BR&gt;VARIANT va; &lt;BR&gt;int a=2001; &lt;BR&gt;va.vt=VT_I4;///指明整型数据 &lt;BR&gt;va.lVal=a; ///赋值 &lt;BR&gt;&lt;BR&gt;对于不马上赋值的VARIANT，最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系: &lt;BR&gt;&lt;BR&gt;Byte bVal;&amp;nbsp;&amp;nbsp;// VT_UI1. &lt;BR&gt;Short iVal;&amp;nbsp;&amp;nbsp;// VT_I2. &lt;BR&gt;long lVal;&amp;nbsp;&amp;nbsp;// VT_I4. &lt;BR&gt;float fltVal;&amp;nbsp;&amp;nbsp;// VT_R4. &lt;BR&gt;double dblVal;&amp;nbsp;&amp;nbsp;// VT_R8. &lt;BR&gt;VARIANT_BOOL boolVal;&amp;nbsp;&amp;nbsp;// VT_BOOL. &lt;BR&gt;SCODE scode;&amp;nbsp;&amp;nbsp;// VT_ERROR. &lt;BR&gt;CY cyVal;&amp;nbsp;&amp;nbsp;// VT_CY. &lt;BR&gt;DATE date;&amp;nbsp;&amp;nbsp;// VT_DATE. &lt;BR&gt;BSTR bstrVal;&amp;nbsp;&amp;nbsp;// VT_BSTR. &lt;BR&gt;DECIMAL FAR* pdecVal&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_DECIMAL. &lt;BR&gt;IUnknown FAR* punkVal;&amp;nbsp;&amp;nbsp;// VT_UNKNOWN. &lt;BR&gt;IDispatch FAR* pdispVal;&amp;nbsp;&amp;nbsp;// VT_DISPATCH. &lt;BR&gt;SAFEARRAY FAR* parray;&amp;nbsp;&amp;nbsp;// VT_ARRAY|*. &lt;BR&gt;Byte FAR* pbVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_UI1. &lt;BR&gt;short FAR* piVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_I2. &lt;BR&gt;long FAR* plVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_I4. &lt;BR&gt;float FAR* pfltVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_R4. &lt;BR&gt;double FAR* pdblVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_R8. &lt;BR&gt;VARIANT_BOOL FAR* pboolVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_BOOL. &lt;BR&gt;SCODE FAR* pscode;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_ERROR. &lt;BR&gt;CY FAR* pcyVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_CY. &lt;BR&gt;DATE FAR* pdate;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_DATE. &lt;BR&gt;BSTR FAR* pbstrVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_BSTR. &lt;BR&gt;IUnknown FAR* FAR* ppunkVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_UNKNOWN. &lt;BR&gt;IDispatch FAR* FAR* ppdispVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_DISPATCH. &lt;BR&gt;SAFEARRAY FAR* FAR* pparray;&amp;nbsp;&amp;nbsp;// VT_ARRAY|*. &lt;BR&gt;VARIANT FAR* pvarVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_VARIANT. &lt;BR&gt;void FAR* byref;&amp;nbsp;&amp;nbsp;// Generic ByRef. &lt;BR&gt;char cVal;&amp;nbsp;&amp;nbsp;// VT_I1. &lt;BR&gt;unsigned short uiVal;&amp;nbsp;&amp;nbsp;// VT_UI2. &lt;BR&gt;unsigned long ulVal;&amp;nbsp;&amp;nbsp;// VT_UI4. &lt;BR&gt;int intVal;&amp;nbsp;&amp;nbsp;// VT_INT. &lt;BR&gt;unsigned int uintVal;&amp;nbsp;&amp;nbsp;// VT_UINT. &lt;BR&gt;char FAR * pcVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_I1. &lt;BR&gt;unsigned short FAR * puiVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_UI2. &lt;BR&gt;unsigned long FAR * pulVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_UI4. &lt;BR&gt;int FAR * pintVal;&amp;nbsp;&amp;nbsp;// VT_BYREF|VT_INT. &lt;BR&gt;unsigned int FAR * puintVal;&amp;nbsp;&amp;nbsp;//VT_BYREF|VT_UINT. &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;_variant_t是VARIANT的封装类，其赋值可以使用强制类型转换，其构造函数会自动处理这些数据类型。 &lt;BR&gt;使用时需加上＃i nclude &lt;BR&gt;例如： &lt;BR&gt;long l=222; &lt;BR&gt;ing i=100; &lt;BR&gt;_variant_t lVal(l); &lt;BR&gt;lVal = (long)i; &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;COleVariant的使用与_variant_t的方法基本一样，请参考如下例子： &lt;BR&gt;COleVariant v3 = "字符串", v4 = (long)1999; &lt;BR&gt;CString str =(BSTR)v3.pbstrVal; &lt;BR&gt;long i = v4.lVal; &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;六、其它一些COM数据类型 &lt;BR&gt;&lt;BR&gt;根据ProgID得到CLSID &lt;BR&gt;HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid); &lt;BR&gt;CLSID clsid; &lt;BR&gt;CLSIDFromProgID( L"MAPI.Folder",&amp;amp;clsid); &lt;BR&gt;&lt;BR&gt;根据CLSID得到ProgID &lt;BR&gt;WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID); &lt;BR&gt;例如我们已经定义了 CLSID_IApplication,下面的代码得到ProgID &lt;BR&gt;LPOLESTR pProgID = 0; &lt;BR&gt;ProgIDFromCLSID( CLSID_IApplication,&amp;amp;pProgID); &lt;BR&gt;...///可以使用pProgID &lt;BR&gt;CoTaskMemFree(pProgID);//不要忘记释放 &lt;BR&gt;&lt;BR&gt;七、ANSI与Unicode &lt;BR&gt;Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。 &lt;BR&gt;&lt;BR&gt;将ANSI转换到Unicode &lt;BR&gt;(1)通过L这个宏来实现，例如: CLSIDFromProgID( L"MAPI.Folder",&amp;amp;clsid); &lt;BR&gt;(2)通过MultiByteToWideChar函数实现转换,例如: &lt;BR&gt;char *szProgID = "MAPI.Folder"; &lt;BR&gt;WCHAR szWideProgID[128]; &lt;BR&gt;CLSID clsid; &lt;BR&gt;long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID)); &lt;BR&gt;szWideProgID[lLen] = '\0'; &lt;BR&gt;(3)通过A2W宏来实现,例如: &lt;BR&gt;USES_CONVERSION; &lt;BR&gt;CLSIDFromProgID( A2W(szProgID),&amp;amp;clsid); &lt;BR&gt;将Unicode转换到ANSI &lt;BR&gt;(1)使用WideCharToMultiByte,例如: &lt;BR&gt;// 假设已经有了一个Unicode 串 wszSomeString... &lt;BR&gt;char szANSIString [MAX_PATH]; &lt;BR&gt;WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL ); &lt;BR&gt;(2)使用W2A宏来实现,例如: &lt;BR&gt;USES_CONVERSION; &lt;BR&gt;pTemp=W2A(wszSomeString); &lt;BR&gt;八、其它 &lt;BR&gt;&lt;BR&gt;对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据（DWORD)分解成两个16位数据（WORD),例如： &lt;BR&gt;LPARAM lParam; &lt;BR&gt;WORD loValue = LOWORD(lParam);///取低16位 &lt;BR&gt;WORD hiValue = HIWORD(lParam);///取高16位 &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如: &lt;BR&gt;WORD wValue; &lt;BR&gt;BYTE loValue = LOBYTE(wValue);///取低8位 &lt;BR&gt;BYTE hiValue = HIBYTE(wValue);///取高8位 &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;两个16位数据（WORD）合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM) &lt;BR&gt;LONG MAKELONG( WORD wLow, WORD wHigh ); &lt;BR&gt;WPARAM MAKEWPARAM( WORD wLow, WORD wHigh ); &lt;BR&gt;LPARAM MAKELPARAM( WORD wLow, WORD wHigh ); &lt;BR&gt;LRESULT MAKELRESULT( WORD wLow, WORD wHigh ); &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;两个8位的数据(BYTE)合成16位的数据(WORD) &lt;BR&gt;WORD MAKEWORD( BYTE bLow, BYTE bHigh ); &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值 &lt;BR&gt;COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue ); &lt;BR&gt;例如COLORREF bkcolor = RGB(0x22,0x98,0x34); &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;从COLORREF类型的颜色值得到RGB三个颜色值 &lt;BR&gt;BYTE Red = GetRValue(bkcolor); ///得到红颜色 &lt;BR&gt;BYTE Green = GetGValue(bkcolor); ///得到绿颜色 &lt;BR&gt;BYTE Blue = GetBValue(bkcolor); ///得到兰颜色 &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;九、注意事项 &lt;BR&gt;假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma comment( lib, "comsupp.lib" )&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;////////////////////////////////////////////////////&lt;BR&gt;//以下是回复&lt;BR&gt;
&lt;P&gt;pstr=(LPSTR)(LPCTSTR)strCString; //CString----&amp;gt;char* &lt;BR&gt;strcpy(strchar,(LPSTR)(LPCTSTR)strCString); //CString----&amp;gt;char[] &lt;BR&gt;&lt;BR&gt;_bstr_t strbstr=pstr; //char*----&amp;gt;_bstr_t &lt;BR&gt;WCHAR *strWCHAR=strbstr; //b_str_t---&amp;gt;UNICODE &lt;BR&gt;&lt;BR&gt;strbstr=strWCHAR; &lt;BR&gt;pstr=strbstr; //UNICODE----&amp;gt;char* &lt;BR&gt;&lt;BR&gt;strCString="6"; &lt;BR&gt;int istr=atoi((LPSTR)(LPCTSTR)strCString); //CString、char[]、char*------&amp;gt;int &lt;BR&gt;strCString.Format("%d",istr); //int-----&amp;gt;CString &lt;BR&gt;sprintf(strchar,"%d",istr); //int-----&amp;gt;char[] &lt;BR&gt;&lt;BR&gt;string strstring="ABC"; &lt;BR&gt;pstr=(char*)strstring.c_str(); //string----&amp;gt;char* &lt;BR&gt;&lt;BR&gt;strCString="2004-11-27 3:25:30"; //CString---&amp;gt;COleDateTime &lt;BR&gt;COleVariant vtime(strCString); &lt;BR&gt;vtime.ChangeType(VT_DATE); &lt;BR&gt;COleDateTime time4=vtime; &lt;BR&gt;&lt;BR&gt;COleDateTime time1(2004,5,14,3,2,2); //COleDataTime---&amp;gt;CTime &lt;BR&gt;SYSTEMTIME systime; &lt;BR&gt;VariantTimeToSystemTime(time1, &amp;amp;systime); &lt;BR&gt;CTime tm(systime); &lt;BR&gt;&lt;BR&gt;time_t time2=tm.GetTime(); //CTime---&amp;gt;time_t &lt;BR&gt;COleDateTime time3(time2); //time_t---&amp;gt;COleDateTime &lt;BR&gt;&lt;BR&gt;//判断字符串是否是某种类型 &lt;BR&gt;CString sValue("12.1"); &lt;BR&gt;COleVariant vValue(sValue); &lt;BR&gt;&lt;BR&gt;BOOL bStrIsFloat = (SUCCEEDED(VariantChangeType(&amp;amp;vValue, &amp;amp;vValue, 0, VT_R8)) &amp;amp;&amp;amp; sValue.Find('.') != -1); &lt;BR&gt;if(bStrIsFloat) &lt;BR&gt;{ &lt;BR&gt;AfxMessageBox("浮点"); &lt;BR&gt;} &lt;BR&gt;}&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/jim97/aggbug/11827.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>木子的blog</dc:creator><title>在程式中对键盘、鼠标、显示器、桌面 操作小结 </title><link>http://blog.vckbase.com/jim97/articles/11789.html</link><pubDate>Fri, 02 Sep 2005 06:37:00 GMT</pubDate><guid>http://blog.vckbase.com/jim97/articles/11789.html</guid><wfw:comment>http://blog.vckbase.com/jim97/comments/11789.html</wfw:comment><comments>http://blog.vckbase.com/jim97/articles/11789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/jim97/comments/commentRss/11789.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jim97/services/trackbacks/11789.html</trackback:ping><description>&lt;STRONG&gt;&lt;FONT color=#0000ff size=6&gt;一 键盘&lt;/FONT&gt;&lt;/STRONG&gt; 
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;1.1 Disabling Low-level Keys&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;#define _WIN32_WINNT 0x0400&lt;BR&gt;#include &lt;WINDOWS.H&gt;&lt;BR&gt;LRESULT CALLBACK LowLevelKeyboardProc(int nCode, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WPARAM wParam, LPARAM lParam) &lt;BR&gt;{&lt;BR&gt;&amp;nbsp;BOOL fEatKeystroke = FALSE;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;if (nCode == HC_ACTION) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;switch (wParam) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;case WM_KEYDOWN:&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;case WM_SYSKEYDOWN:&lt;BR&gt;&amp;nbsp;&amp;nbsp;case WM_KEYUP:&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;case WM_SYSKEYUP: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;fEatKeystroke = &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((p-&amp;gt;vkCode == VK_TAB)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp;&amp;nbsp; ((p-&amp;gt;flags &amp;amp; LLKHF_ALTDOWN) != 0)) ||&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((p-&amp;gt;vkCode == VK_ESCAPE) &amp;amp;&amp;amp;&amp;nbsp; ((p-&amp;gt;flags &amp;amp; LLKHF_ALTDOWN) != 0)) ||&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((p-&amp;gt;vkCode == VK_ESCAPE) &amp;amp;&amp;amp;&amp;nbsp; ((GetKeyState(VK_CONTROL)&amp;amp;0x8000) != 0))||&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;( p-&amp;gt;vkCode == VK_LWIN)&amp;nbsp;&amp;nbsp; ||&amp;nbsp; ( p-&amp;gt;vkCode==VK_RWIN )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, &lt;BR&gt;&amp;nbsp;&amp;nbsp;lParam));&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) &lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; // Install the low-level keyboard &amp;amp; mouse hooks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HHOOK hhkLowLevelKybd&amp;nbsp; = SetWindowsHookEx(WH_KEYBOARD_LL, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;LowLevelKeyboardProc, hinstExe, 0);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; // Keep this app running until we're told to stop&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;MessageBox(NULL, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TEXT("Alt+Esc, Ctrl+Esc, Alt+Tab, LWIN and RWIN are now disabled.\n")&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TEXT("Click \"Ok\" to terminate this application and re-enable these keys."),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TEXT("Disable Low-Level Keys"),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;MB_OK);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UnhookWindowsHookEx(hhkLowLevelKybd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(0);&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;1.2 系统热键&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.屏蔽:SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true，0, SPIF_UPDATEINIFILE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.恢复:SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,false,&amp;nbsp; 0, SPIF_UPDATEINIFILE);&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;1.3 模拟按键&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#000000&gt;让系统模拟一次按下WIN+D键&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;keybd_event(VK_LWIN,0,0,0); &amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;keybd_event('D',0,0,0); &amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0); &amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;keybd_event('D',0,KEYEVENTF_KEYUP,0); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;1.4 切换到当前桌面&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;模拟最小化屏幕快捷键Window+D &amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;keybd_event(VK_LWIN,0,0,0); &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;keybd_event('D',0,0,0); &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0); &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;keybd_event('D',0,KEYEVENTF_KEYUP,0); &amp;nbsp;&lt;BR&gt;--------------------------------------------------------------- &amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;正统的办法如下： &amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#include &amp;nbsp;&lt;WINDOWS.H&gt; &amp;nbsp;&lt;BR&gt;#include &amp;nbsp;&lt;SHLDISP.H&gt; &amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;int &amp;nbsp;main &amp;nbsp;() &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CoInitialize &amp;nbsp;(0); &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IShellDispatch4 &amp;nbsp;*pdisp &amp;nbsp;= &amp;nbsp;NULL; &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CoCreateInstance &amp;nbsp;(CLSID_Shell, &amp;nbsp;NULL, &amp;nbsp;CLSCTX_ALL, &amp;nbsp;__uuidof &amp;nbsp;(IShellDispatch4), &amp;nbsp;(void &amp;nbsp;**)&amp;amp;pdisp); &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pdisp-&amp;gt;ToggleDesktop &amp;nbsp;(); &amp;nbsp;// &amp;nbsp;这句是用来切换桌面的 &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pdisp-&amp;gt;Release &amp;nbsp;(); &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CoUninitialize &amp;nbsp;(); &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;1.5 调出关机选择画面&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;////////调出关机选择画面：（重启、关机、休眠、待机） &amp;nbsp;&lt;BR&gt;typedef &amp;nbsp;int &amp;nbsp;(CALLBACK &amp;nbsp;*SHUTDOWNDLG)(int); &amp;nbsp;//显示关机对话框函数的指针 &amp;nbsp;&lt;BR&gt;HINSTANCE &amp;nbsp;hInst &amp;nbsp;= &amp;nbsp;LoadLibrary("shell32.dll"); &amp;nbsp;//装入shell32.dll &amp;nbsp;&lt;BR&gt;SHUTDOWNDLG &amp;nbsp;ShutDownDialog; &amp;nbsp;//指向shell32.dll库中显示关机对话框函数的指针 &amp;nbsp;&lt;BR&gt;if(hInst &amp;nbsp;!= &amp;nbsp;NULL) &amp;nbsp;&lt;BR&gt;{ &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//获得函数的地址并调用之 &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ShutDownDialog &amp;nbsp;= &amp;nbsp;(SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60); &amp;nbsp;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(*ShutDownDialog)(0); &amp;nbsp;&lt;BR&gt;}&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=6&gt;&lt;STRONG&gt;二 鼠标&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;2.1&amp;nbsp;&amp;nbsp;&amp;nbsp;::ClipCursor(&amp;amp;rect);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ::ClipCursor(NULL);&lt;/P&gt;
&lt;P&gt;2.2 一个未公开的API函数BlockInput，在user32.dll中，用它可以&lt;BR&gt;轻易的锁定键盘和鼠标。&lt;/P&gt;
&lt;P&gt;BOOL __stdcall (*BlockInput)(BOOL Flag);&lt;BR&gt;(FARPROC)BlockInput = GetProcAddress(GetModuleHandle(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "user32.dll"), "BlockInput");&lt;BR&gt;if (BlockInput) BlockInput(TRUE); //这样就可以了&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=6&gt;&lt;STRONG&gt;三 显示器&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;3.1 关闭显示器&lt;/STRONG&gt;&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. SendMessage( WM_SYSCOMMAND, SC_MONITORPOWER, 2);//关显示器&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SendMessage( WM_SYSCOMMAND, SC_SCREENSAVE, 0);//运行屏保&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. ::SendMessage(GetSafeHwnd(), WM_SYSCOMMAND, SC_MONITORPOWER, 2);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. SendMessage(HWND_BROADCAST,WM_SYSCOMMAND,SC_MONITORPOWER,2);&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;3.2 启动屏保&lt;BR&gt;&lt;/STRONG&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PostMessage(WM_SYSCOMMAND,SC_SCREENSAVE,0);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=6&gt;&lt;STRONG&gt;四 系统桌面&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt; 4.1 隐藏任务栏&lt;/FONT&gt;&lt;/STRONG&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 隐藏 ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; or ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 显示 ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_SHOW);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; or ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_SHOW);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;&lt;FONT color=#0000ff&gt;4.2 在任务栏隐藏&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetWindowLong(Application,Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;4.3在任务管理器中隐藏&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;//定义RegisterServiceProcess函数的原型 &lt;BR&gt;typedef DWORD (CALLBACK* LPREGISTERSERVICEPROCESS)(DWORD,DWORD); &lt;/P&gt;
&lt;P&gt;//注册应用程序的进程 &lt;BR&gt;//其中i = 0，将进程注册成非服务进程，这样，在Windows的关闭程序窗口中就不会出现应用程序 &lt;BR&gt;//的名称了。 &lt;BR&gt;// i = 1，将进程注册成服务进程，这是一般应用程序运行时所采用的状态。 &lt;/P&gt;
&lt;P&gt;void RegisterProcess(int i) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HINSTANCE hDLL; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPREGISTERSERVICEPROCESS lpRegisterServiceProcess; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//加载RegisterServiceProcess函数所在的链接库 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hDLL = LoadLibrary("KERNEL32"); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //得到RegisterServiceProcess函数的地址&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(hDLL, "RegisterServiceProcess"); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //执行RegisterServiceProcess函数 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lpRegisterServiceProcess(GetCurrentProcessId(),i); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //卸载链接库 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FreeLibrary(hDLL); &lt;BR&gt;} &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;4.4启动屏保&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;SystemParametersInfo(SPI_SETDESKWALLPAPER,0,"C:\\*.BMP",WM_WININICHANGE);&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/jim97/aggbug/11789.html" width = "1" height = "1" /&gt;</description></item></channel></rss>