1.对话框的key消息先要被PreTranslateMessage函数处理,然后转到onKeyDown处理 ,所有屏蔽一些按键可以到PreTranslateMessage函数里进行(注意过滤WM_KEYDOWN 和 WM_SYSKEYDOWN(一些系统按键))
2.组合键的判断
BOOL bCtrlKeyDown =
GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);
BOOL bAltKeyDown =
GetAsyncKeyState(VK_MENU)>>((sizeof(SHORT) * 8) - 1);
if ((nChar==VK_F8 && bCtrlKeyDown && bAltKeyDown))
{
MessageBox("ctrl+alt+F8");
}
3.查找和杀进程
======================获取进程名称============================
TCHAR szProcessName[MAX_PATH] = TEXT("");
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ ,
FALSE, process_id );
// Get the process name.
if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
}
CloseHandle( hProcess );
=======================获取进程列表=====================================
DWORD process_list[1024],cbNeeded,process_count;
if(!EnumProcesses(process_list,sizeof(process_list),&cbNeeded))
{
return;
}
===========================杀进程==================================
HANDLE process_handle = OpenProcess(PROCESS_VM_WRITE|PROCESS_TERMINATE, false, process_list[i]);//注意权限PROCESS_ALL 无法使用
if(process_handle == NULL) continue;
TerminateProcess(process_handle,0);
CloseHandle(process_handle);
4.VC和BCB的DLL导入导出(最好加extern "C")
#define DLLEXPORT extern "C" __declspec(dllexport)
#define DLLIMPORT extern "C" __declspec(dllimport) _stdcall //BCB导入dll中函数要加_stdcall关键字
5.CRT库和MFC库冲突解决
当在MFC中使用C++标准库时会报
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z) already
解决方法:
选择:菜单“项目”-->“设置”->链接-->Input。
在第一行“对象/库模块”中最前面输入Nafxcwd.lib;Libcmtd.lib
在第二行“忽略库”框中,输入Nafxcwd.lib;Libcmtd.lib。
确定,重新链接,通过!
6.多字节单字节转换
void ToolHelper::UTF8ToUnicode(const char* utf8,wchar_t** unicode)
{
int len = 0;
len = strlen(utf8);
int unicodeLen = ::MultiByteToWideChar(CP_UTF8,0,utf8,-1,NULL,0);
*unicode = (wchar_t*)malloc(unicodeLen*sizeof(wchar_t));
memset((*unicode),0,unicodeLen*sizeof(wchar_t));
::MultiByteToWideChar(CP_UTF8,0,utf8,-1,(LPWSTR)(*unicode),unicodeLen+1);
}
//将utf8转换为多字节
void ToolHelper::UTF8ToANSI(const char* utf8,char** ansiChar)
{
int len = 0;
len = strlen(utf8);
int unicodeLen = ::MultiByteToWideChar(CP_UTF8,0,utf8,-1,NULL,0);
wchar_t* tempchar=NULL;
tempchar = (wchar_t*)malloc(unicodeLen*sizeof(wchar_t));
memset(tempchar,0,unicodeLen*sizeof(wchar_t));
::MultiByteToWideChar(CP_UTF8,0,utf8,-1,(LPWSTR)tempchar,unicodeLen+1);
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,tempchar,-1,NULL,0,NULL,FALSE);
*ansiChar =(char*)malloc(dwNum);
::WideCharToMultiByte(CP_OEMCP,NULL,tempchar,-1,(*ansiChar),dwNum,NULL,FALSE);
if(tempchar!=NULL)
{
free(tempchar);
tempchar=NULL;
}
}
//将多字节转换为utf8
void ToolHelper::ANSIToUTF8(const char* ansiChar,char**utf8Code)
{
wchar_t *chBuf;
char * p=NULL;
int iLen;
iLen = ::MultiByteToWideChar(CP_ACP, 0, ansiChar,-1 , NULL, 0);
chBuf = (wchar_t*)malloc(iLen*sizeof(wchar_t));
memset(chBuf,0,iLen*sizeof(wchar_t));
iLen =::MultiByteToWideChar(CP_ACP, 0, ansiChar, -1, chBuf, iLen+1);
iLen = ::WideCharToMultiByte(CP_UTF8, 0, chBuf,-1 , NULL, 0,NULL,NULL);
p = (char*)malloc(iLen);
memset(p,0,iLen * sizeof(char));
iLen =::WideCharToMultiByte(CP_UTF8, 0, chBuf, -1, p, iLen+1,NULL,NULL);
*utf8Code=p;
if(chBuf!=NULL)
{
free(chBuf);
chBuf=NULL;
}
}
//将宽字节转换为utf8
void ToolHelper::UnicodeToUTF8(const wchar_t* unicode,char** utf8Code)
{
char* szText=NULL;
DWORD dwNum = ::WideCharToMultiByte(CP_OEMCP,NULL,unicode,-1,NULL,0,NULL,FALSE);
szText=(char*)malloc(dwNum+1);
::WideCharToMultiByte(CP_OEMCP,NULL,unicode,-1,szText,dwNum,NULL,FALSE);
wchar_t *chBuf;
char * p=NULL;
int iLen;
iLen = ::MultiByteToWideChar(CP_ACP, 0, szText,-1 , NULL, 0);
chBuf = (wchar_t*)malloc((iLen+1)*sizeof(wchar_t));
memset(chBuf,0,(iLen)*sizeof(wchar_t));
iLen =::MultiByteToWideChar(CP_ACP, 0, szText, -1, chBuf, iLen+1);
iLen = ::WideCharToMultiByte(CP_UTF8, 0, chBuf,-1 , NULL, 0,NULL,NULL);
p = (char*)malloc(iLen);
memset(p,0,iLen * sizeof(char));
iLen =::WideCharToMultiByte(CP_UTF8, 0, chBuf, -1, p, iLen+1,NULL,NULL);
*utf8Code=p;
if(szText!=NULL)
{
free(szText);
szText=NULL;
}
if(chBuf!=NULL)
{
free(chBuf);
chBuf=NULL;
}
}
//将多字节转换为宽字节
void ToolHelper::CharToWChar(const char *ansiChar, wchar_t **unicode)
{
int ansiLen=strlen(ansiChar)+1 ;
int nwLen = ::MultiByteToWideChar(CP_ACP, 0, ansiChar, ansiLen , NULL, 0);
*unicode=(wchar_t*)malloc(nwLen*sizeof(wchar_t));
memset(*unicode,0,nwLen*sizeof(wchar_t));
::MultiByteToWideChar(CP_ACP, 0, ansiChar, -1, *unicode, nwLen);
}
//将宽字节转换为多字节
void ToolHelper::WCharToChar(const wchar_t *unicode,char **ansiChar)
{
DWORD dwNum = ::WideCharToMultiByte(CP_OEMCP,NULL,unicode,-1,NULL,0,NULL,FALSE);
*ansiChar=(char*)malloc(dwNum);
memset(*ansiChar,0,dwNum);
::WideCharToMultiByte(CP_OEMCP,NULL,unicode,-1,*ansiChar,dwNum,NULL,FALSE);
}
7.判断文件是否存在
int file_exists(const char *filepath)
{
return (_access(filepath, 0) == 0);
}
8.VC2010命令行编译
MSBuild EasyKeyTool.sln /t:Rebuild /p:Configuration=Release
9.修改应用程序图标
HICON hIcon = ::LoadIconW(hInstance, MAKEINTRESOURCE(IDI_CEFCLIENT) );
::SendMessage( hWnd, WM_SETICON, TRUE, (LPARAM)hIcon );
::SendMessage( hWnd, WM_SETICON, FALSE, (LPARAM)hIcon );
10.C/C++混合编译时,注意把C的代码使用extern "C"括号起来
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
#ifdef __cplusplus
}
#endif // __cplusplus
11.导出Dll函数
a.新建一个Win32的Dll工程
b.使用代码导出函数
#if 0 #define DLL_EXPORT extern "C" __declspec(dllexport) #else #define DLL_EXPORT #endif DLL_EXPORT int _cdecl add(int a,int b);
使用def文件导出函数
LIBRARY mydll EXPORTS add @1
图片控件使用
CImage m_PicSrc;
m_PicSrc.Load( L"c:\\1.jpg");
CDC* pDC = GetDlgItem(IDC_STATIC_PIC)->GetWindowDC();
m_PicSrc.Draw( pDC -> m_hDC, 1, 1 );
ReleaseDC( pDC );
截获mfc控件的消息方法
1.重新继承一个控件,重写相应事件
2.主窗口windowproc
int wmId, wmEvent;
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
图像绘制双缓存
RECT rect;
m_InvoicePic.GetClientRect(&rect);
CDC* pDC = GetDlgItem(IDC_STATIC_PIC)->GetWindowDC();
CDC memDC;
CBitmap memBitmap;
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
memDC.SelectObject(&memBitmap);
memDC.FillSolidRect(&rect,pDC->GetBkColor());
int x=0,y=0;
GetShowPicPos(&x,&y);
m_PicSrc.Draw( memDC, 0, y );
pDC->BitBlt(0,0,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);
memDC.DeleteDC();
memBitmap.DeleteObject();
ReleaseDC( pDC );