VC一些小细节.docx
《VC一些小细节.docx》由会员分享,可在线阅读,更多相关《VC一些小细节.docx(14页珍藏版)》请在冰豆网上搜索。
VC一些小细节
VC一些小细节
1vc++中WM_QUERYENDSESSIONWM_ENDSESSION为系统[xitong]关机消息[xiaoxi]。
2在VC下执行[zhihang]DOS命令[mingling]
a.system("mdc:
\\12");
b.WinExec("Cmd.exe/Cmdc:
\\12",SW_HIDE);
c.ShellExecute
ShellExecute(NULL,"open","d:
\\WINDOWS\\system32\\cmd.exe","/cmdd:
\\zzz","",SW_SHOW);
d.CreateProcess
下面这个示例的函数[hanshu]可以把给定的DOS命令[mingling]执行[zhihang]一遍,并把DOS下的输出[shuchu]内容记录在buffer中。
同时示范了匿名管道重定向[zhongdingxiang]输出[shuchu]的用法:
-------------------------------------------------------------------------------------
BOOLCDOSDlg:
:
ExecDosCmd()
{
#defineEXECDOSCMD"dirc:
"//可以换成你的命令[mingling]
SECURITY_ATTRIBUTESsa;
HANDLEhRead,hWrite;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;
if(!
CreatePipe(&hRead,&hWrite,&sa,0))
{
returnFALSE;
}
charcommand[1024];//长达1K的命令[mingling]行[minglinghang],够用了吧
strcpy(command,"Cmd.exe/C");
strcat(command,EXECDOSCMD);
STARTUPINFOsi;
PROCESS_INFORMATIONpi;
si.cb=sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError=hWrite;//把创建进程[jincheng]的标准错误[cuowu]输出[shuchu]重定向[zhongdingxiang]到管道输入[shuru]
si.hStdOutput=hWrite;//把创建进程[jincheng]的标准输出[shuchu][biaozhunshuchu]重定向[zhongdingxiang]到管道输入[shuru]
si.wShowWindow=SW_HIDE;
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数[hanshu]参数[canshu]意义请查阅MSDN
if(!
CreateProcess(NULL,command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
CloseHandle(hWrite);
CloseHandle(hRead);
returnFALSE;
}
CloseHandle(hWrite);
charbuffer[4096]={0};//用4K的空间[kongjian]来存储输出[shuchu]的内容,只要不是显示[xianshi]文件[wenjian][xianshiwenjian]内容,一般情况[qingkuang]下是够用了。
DWORDbytesRead;
while(true)
{
if(ReadFile(hRead,buffer,4095,&bytesRead,NULL)==NULL)
break;
//buffer中就是执行[zhihang]的结果,可以保存到文本[wenben],也可以直接输出[shuchu]
AfxMessageBox(buffer);//这里是弹出对话框[duihuakuang]显示[xianshi]
}
CloseHandle(hRead);
returnTRUE;
}
-------------------------------------------------------------------------------------
3删除[shanchu]目录,包含删除[shanchu]子文件[wenjian]夹以及其中的内容
-------------------------------------------------
BOOLDeleteDirectory(char*DirName)//如删除[shanchu]DeleteDirectory("c:
\\aaa")
{
CFileFindtempFind;
chartempFileFind[MAX_PATH];
sprintf(tempFileFind,"%s\\*.*",DirName);
BOOLIsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!
tempFind.IsDots())
{
charfoundFileName[MAX_PATH];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
if(tempFind.IsDirectory())
{
chartempDir[MAX_PATH];
sprintf(tempDir,"%s\\%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
chartempFileName[MAX_PATH];
sprintf(tempFileName,"%s\\%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!
RemoveDirectory(DirName))
{
MessageBox(0,"删除[shanchu]目录失败!
","警告信息[xinxi]",MB_OK);//比如没有找到文件[wenjian]夹,删除[shanchu]失败,可把此句删除[shanchu]
returnFALSE;
}
returnTRUE;
}
-------------------------------------------------------------
4让程序暂停[zanting][chengxuzanting]:
system("PAUSE");
5在PreTranslateMessage中捕捉键盘[jianpan]事件[shijian]
if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_RETURN)returnTRUE;//注意return的值
6更改按键消息[xiaoxi](下面的代码[daima]可把回车键消息[xiaoxi]改为TAB键消息[xiaoxi])
-------------------------------------------------------
BOOLCT3Dlg:
:
PreTranslateMessage(MSG*pMsg)
{
if(pMsg->message==WM_KEYDOWN&&VK_RETURN==pMsg->wParam)
{
pMsg->wParam=VK_TAB;
}
returnCDialog:
:
PreTranslateMessage(pMsg);
}
------------------------------------------
7MoveWindow:
一个可以移动、改变窗口[chuangkou]位置[weizhi]和大小的函数[hanshu]
816进制转化成10进制小数的问题[wenti]
用一个读二进制[erjinzhi]文件[wenjian][erjinzhiwenjian]的软件[ruanjian]读文件[wenjian]
二进制[erjinzhi]文件[wenjian][erjinzhiwenjian]中的一段8FC2F53C最后变成了0.03
请问这是怎么转换[zhuanhuan]过来的?
?
方法[fangfa]一:
浮点技术法,如
DWORDdw=0x3CF5C28F;
floatd=*(float*)&dw;//0.03;
方法[fangfa]二:
浮点的储存方式和整数完全两样,你想了解的话可以去
看一看,不过通常我们都不必了解它就可以完成转换[zhuanhuan]。
chara[4]={0x8F,0xC2,0xF5,0x3C};
floatf;
memcpy(&f,a,sizeof(float));
TRACE("%d",0x3CF5C28F);
9EDIT控件的 EM_SETSEL,EM_REPLACESEL消息[xiaoxi]
10在其它进程[jincheng]中监视键盘[jianpan]消息[xiaoxi]:
用SetWindowsHookEx(WH_KEYBOARD_LL,...);
13在桌面[zhuomian]上任意位置[weizhi]写字
--------------------------------------------------
HDCdeskdc=:
:
GetDC(0);
CStringstext="我的桌面[zhuomian]";
:
:
TextOut(deskdc,100,200,stext,stext.GetLength());
:
:
ReleaseDC(0,deskdc);
------------------------------------------------------
14HWNDthread_hwnd=Findwindow(NULL,"你要监控的进程[jincheng]窗体[chuangti](用SPY++看)"),
if(thread_hwnd==NULL)。
。
。
。
。
。
。
。
。
。
elseDWORDthread_id=GetWindowThreadProcessId(thread_hwnd,NULL)
15waveOutGetVolume()可以得到波形[boxing]音量大小
16隐藏桌面[zhuomian]图标[tubiao]并禁用右键[youjian]功能菜单[caidan]:
------------------------------------
HWNDHwd=:
:
FindWindow("Progman",NULL);
if(bShowed)
:
:
ShowWindow(Hwd,SW_HIDE);
else
:
:
ShowWindow(Hwd,SW_SHOW);
bShowed=!
bShowed;
---------------------------------------
17获得程序当前路径[lujing]:
---------------------------------------------
charch[256];
GetModuleFileName(NULL,ch,255);
for(inti=strlen(ch);i&&ch[i]!
='\\';i--);
ch[i]=0;
AfxMessageBox(ch);
----------------------------------------------
18KeyboardProc的lParam中包含着许多按键信息[xinxi],其中第31位(从0开始)为0表示是按下按键,为1表示松开按键。
(lParam&0x80000000)进行二进制[erjinzhi]'与'计算,效果是取第31位的值。
(lParam&0x40000000)是取第30位,30位表示按键的上一个状态[zhuangtai],为1表示之前键已经是按下的,0表示松开。
lParam
[in]Specifiestherepeatcount,scancode,extended-keyflag,contextcode,previouskey-stateflag,andtransition-stateflag.FormoreinformationaboutthelParamparameter,seeKeystrokeMessageFlags.Thisparametercanbeoneormoreofthefollowingvalues.
0-15
Specifiestherepeatcount.Thevalueisthenumberoftimesthekeystrokeisrepeatedasaresultoftheuser'sholdingdownthekey.
16-23
Specifiesthescancode.ThevaluedependsontheOEM.
24
Specifieswhetherthekeyisanextendedkey,suchasafunctionkeyorakeyonthenumerickeypad.Thevalueis1ifthekeyisanextendedkey;otherwise,itis0.
25-28
Reserved.
29
Specifiesthecontextcode.Thevalueis1iftheALTkeyisdown;otherwise,itis0.
30
Specifiesthepreviouskeystate.Thevalueis1ifthekeyisdownbeforethemessageissent;itis0ifthekeyisup.
31
Specifiesthetransitionstate.Thevalueis0ifthekeyisbeingpressedand1ifitisbeingreleased.
19复制文件[wenjian]应该用到CopyFile或是CopyFileEx这两个API
20移动窗口[chuangkou]的位置[weizhi]或改变大小:
MoveWindow/SetWindowPos
21我的程序是当前运行[yunhang]的程序时,可以用setcursor()来设置[shezhi]光标[guangbiao]的图标[tubiao]。
而且可以用setcapture()是鼠标[shubiao]移动到我得程序窗口[chuangkou]之外时也是我设置[shezhi]的图标[tubiao]
但是如果我得程序不是当前的运行[yunhang]程序的,鼠标[shubiao]就会变会默认[moren]的。
怎样能够,使得不变回默认[moren]的,还是用我设置[shezhi]的光标[guangbiao]?
SetSystemCursor
22SendMessage函数[hanshu]的几个用法:
控制[kongzhi]按钮按下的,是这么用的
SendMessage(n1,WM_COMMAND,MAKELPARAM(ID,BN_CLICKED),(LPARAM)n2); (n1,n2是句柄[jubing])
而得到文本[wenben]内容,是这样用的,
SendMessage(hWnd,WM_GETTEXT,10,(LPARAM)buf),
23处理一个单行EDIT的WM_CTLCOLOR要同时响应[xiangying]nCtlColor=CTLCOLOR_EDIT和CTLCOLOR_MSGBOX的两个情况[qingkuang],参考[cankao]
24设备发生改变处理函数[hanshu]可在CWnd:
:
OnDeviceChange中,捕获[buhuo]WMDEVICECHANGE事件[shijian]不能区分诸如设备插入、拔下消息[xiaoxi]。
25把字符[zifu]"abc\n123"存入文本[wenben]文件[wenjian]中时,文件[wenjian]内容没看见换行[huanhang],其实用word打开该文件[wenjian]是有换行[huanhang]的。
另外用"abc\r\n123"代替也可看见换行[huanhang]。
26:
:
SetFocus(:
:
GetDesktopWindow());或:
:
BringWindowToTop(:
:
GetDesktopWindow());
:
:
GetDesktopWindow()这里可获得桌面[zhuomian]窗口[chuangkou]的句柄[jubing]
27数组[shuzu]初始化[chushihua]:
inta[24][34];//声明[shengming]数组[shuzu]
memset(a,-1,24*34);//全部元素初始化[chushihua]成-1,但初始化[chushihua]成除0和-1以外的数值是不行的
28SHGetFileInfo函数[hanshu]可获得文件[wenjian]信息[xinxi]。
29创建一个控件:
HWNDhEdit=CreateWindow("EDIT",NULL,WS_CHILD|WS_VISIBLE|ES_LEFT,50,20,50,20,hwnd,NULL,hInst,NULL);//hwnd参数[canshu]为父窗口[chuangkou]句柄[jubing]
30VC中对声音文件[wenjian]的操作:
31调用[tiaoyong]其它程序又要隐藏窗口[chuangkou]:
用CreateProcess函数[hanshu]调用[tiaoyong][hanshutiaoyong],再拿到窗口[chuangkou]句柄[jubing],然后:
:
ShowWindow(hWnd,SW_HIDE);
32 读取[duqu]文本[wenben]文件[wenjian]中的一行:
用CFile类的派生[paisheng]类[paishenglei]:
CStdioFile的方法[fangfa]:
CStdioFile:
:
ReadString
33删除[shanchu]非空文件[wenjian]夹:
------------------------------------------------
SHFILEOPSTRUCTshfileop;
shfileop.hwnd=NULL;
shfileop.wFunc=FO_DELETE;
shfileop.fFlags=FOF_SILENT|FOF_NOCONFIRMATION;
shfileop.pFrom="c:
\\temp";//要删除[shanchu]的文件[wenjian]夹
shfileop.pTo="";
shfileop.lpszProgressTitle="";
shfileop.fAnyOperationsAborted=TRUE;
intnOK=SHFileOperation(&shfileop);
-------------------------------------------------
34函数[hanshu]前面加上:
:
是什么意思?
叫域运算[yunsuan]符...在MFC中表示调用[tiaoyong]API...或其它全局函数[hanshu]...为了区分是mfc函数[hanshu]还是api
详见:
35CImageList的用法:
36有关控件的一些常见问答:
<==========================很不错的地方哦
37在多文档[wendang]客户[kehu]区中增加位图[weitu]底图演示程序[yanshichengxu]:
我的对应工程:
AddBackgroundBitmap
38用VC++6.0实现PC机与单片机[danpi