【编程笔记】2012 - 2016年

来源:互联网 发布:js跨域cookie 编辑:程序博客网 时间:2024/04/30 13:59

自定义资源加入程序 程序运行之后创建Dll
HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_DLL), "dll");
HGLOBAL hDllData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
LPVOID lpVoid    = ::LockResource(hDllData);
LPSTREAM pStream = NULL;
DWORD dwSize    = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
HGLOBAL hNew    = ::GlobalAlloc(GHND, dwSize);
LPBYTE lpByte    = (LPBYTE)::GlobalLock(hNew);
::memcpy(lpByte, lpVoid, dwSize);
DWORD recvSize = 0;
HANDLE file = CreateFile("WinLockDll.dll", GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(file, lpByte, dwSize, &recvSize, NULL);
::GlobalUnlock(hNew);
GlobalFree(hNew);
::FreeResource(hDllData);


解决c++Dll编写过程中出现的definition of dllimport function not allowed 
dllimport   导入,在使用dll的地方声明时使用,
dllexport 导出,在创建dll的代码中定义使用。


创建隐藏文件夹
CreateDirectory("C:\\Program Files\\SaveLoss", NULL);
SetFileAttributes("C:\\Program Files\\SaveLoss", FILE_ATTRIBUTE_HIDDEN);


CopyFile(FullPathName, pName, FALSE);
False 覆盖存在的文件
True 不改变已经存在的文件


nafxcw.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcw.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
解決project->settings->general->microsoft foundation classes->选use MFC in a static library或选 use 


main函数的返回值是一个错误代码 当你运行一个程序之后可以用 echo %errorlever% 输出main函数的返回值
打开附件里的“命令提示符”在命令行里面运行刚才编译好的可执行文件 然后输入"echo %ERRORLEVEL%"


*.idl Interface definition file 是一个接口文件用于描述接口
类似于PRC的.x文件。接口定义语言类似一个协议,来规定接入对象的行为。  
用RPC / COM / CORBA技术来编写分布式系统时都需要接口定义语言(IDL)。


IsDlgButtonChecked检查radio button是否被选中
让radiobutton选中的方法((CButton *)GetDlgItem(IDC_LANGFANG))->SetCheck(TRUE);


C++刪除原本文件的信息
xml.SetLength(0);
xml.SeekToBegin();
xml.Write(pNewBuffer, lstrlen(pNewBuffer));


HINSTANCE句柄对于加载资源特别重要。EXE和DLL都有其自己的资源,而且这些资源的ID可能重复,如果应用程序与规则DLL共享MFC DLL(或MFC扩展DLL),那么将总是默认使用EXE的资源。
解決:方法1。
// in DLL
void CDLL::ShowDlg(void)
{
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
       CDialog dlg(IDD_DLL_DIALOG); //打开ID为2000的对话框
       dlg.DoModal();
}
注:AFX_MANAGE_STATE(AfxGetStaticModuleState());一定是作为接口函数的第一条语句。
       其功能是在栈上(这意味着其作用域是局部的)创建一个AFX_MODULE_STATE类的实例,并将其指   针pModuleState返回。
       AFX_MODULE_STATE类利用其构造函数和析构函数进行存储模块状态现场及恢复现场的工作。
       该宏用于将pModuleState设置为当前的有效模块状态。当离开该宏的作用域时(也就离开了pModuleState所指栈上对象的作用域),先前的模块状态将由类AFX_MODULE_STATE的析构函数恢复。(即自动恢复)
方法2。
// in DLL
void CDLL::ShowDlg(void)
{
       HINSTANCE save_hInstance = AfxGetResourceHandle();
       AfxSetResourceHandle(theApp.m_hInstance);
       CDialog dlg(IDD_DLL_DIALOG); //打开ID为2000的对话框
       dlg.DoModal();
       AfxSetResourceHandle(save_hInstance);    
}
注:AfxGetResourceHandle:获取当前资源模块句柄;AfxSetResourceHandle:设置程序目前要使用的资源模块句柄。
       同方法1比较,方法2能够灵活地设置程序的资源模块句柄,而方法1则只能在DLL接口函数退出的时候才会恢复模块句柄。
方法3,
// in EXE
void CEXE::OnButtonClick()
{
       HINSTANCE exe_hInstance = GetModuleHandle(NULL);
      HINSTANCE dll_hInstance = GetModuleHandle("SharedDll.dll");
      AfxSetResourceHandle(dll_hInstance); //切换状态
       ShowDlg();
      AfxSetResourceHandle(exe_hInstance); //恢复状态
}


除以0 出來結果 1.#INF
1.#QNAN(这个是quiet "Not a Number")程序出現邏輯錯誤有時候會出現這種數據
SNaN(Signaling Not a Number),
INF就是Infinity,表示一个无穷大的数,包括正无穷和负无穷;
IND则表示无限小


一个程序如果是单线程的话,默认有一个堆,但用户可以申请堆,一个栈,栈用于存放函数返回地址、调用参数、函数体内的局部变量、寄存器信息
如果是多线程的话,每个线程分配一个栈,当时间片轮转的时候就取出各个栈中信息存放到寄存器中运行。


隐藏任务栏窗口
SetWindowLong(m_hWnd,   GWL_EXSTYLE,   WS_EX_TOOLWINDOW);  
如果想让任务栏的图标显示出来只要执行: 
SetWindowLong(m_hWnd,   GWL_EXSTYLE,   WS_EX_APPWINDOW);
MFC中隐藏掉主框架的标题栏
ModifyStyle(WS_CAPTION, NULL, SWP_DRAWFRAME);


debug和release模式下有些函数的处理方式会不一样
debug下DestroyWindow()发现窗口不存在会弹一个Error窗口
release下DestroyWindow()则不会弹出Error


窗口置顶
SetWindowPos(Form-> Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);


拖动窗口客户区
void CLockScreenDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
ReleaseCapture(); 
::SendMessage(m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); 
CDialog::OnLButtonDown(nFlags, point);
}


改变对话框背景颜色
CApp::InitInstance()
{
SetDialogBkColor(RGB(200, 150, 141), RGB(200, 150, 141));
}


//判断进程是否存在
BOOL FindProcessByName(CString name)
{
    int nProcess =0;
    HANDLE snapshot=CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) ;
    if(snapshot == NULL)
        return FALSE ;
    SHFILEINFO shSmall;
    PROCESSENTRY32 processinfo ;
    processinfo.dwSize=sizeof(processinfo) ;
    BOOL status=Process32First(snapshot,&processinfo) ;
    while (status)
    {
        ZeroMemory(&shSmall, sizeof(shSmall));        
        SHGetFileInfo(processinfo.szExeFile,0,&shSmall,sizeof(shSmall),SHGFI_ICON|SHGFI_SMALLICON);
        CString StrInfo=processinfo.szExeFile;
        if(StrInfo.CompareNoCase(name) == 0)
            return TRUE;    
        status = Process32Next (snapshot, &processinfo) ;
        nProcess++;    
    }
    return FALSE;


}


//清理进程
DWORD PID;
FindProcessByName("vcTestUI.exe", PID);
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, PID);
TerminateProcess(hProcess,0);


//通过进程ID获取窗口HWND
void GetWndFromProcID(DWORD dwProcID, HWND hWnd[])

HWND hTempWnd = NULL; 
int n = 0; 
DWORD dwProcTempID = 0; 
while( hTempWnd = FindWindowEx( NULL, hTempWnd, NULL, NULL ) ) 

GetWindowThreadProcessId(hTempWnd, &dwProcTempID); 
if( dwProcTempID == dwProcID) 

hWnd[n++] = hTempWnd;

}
}
void main()
{
DWORD PID = 0;
BOOL isRunning = FindProcessByName("vcTestUI.exe", PID);
HANDLE h_process = NULL;
HWND h_vcTest[100] = {NULL};
if(isRunning)
{
MessageBox("running", "LockScreen");
GetWndFromProcID(PID, h_vcTest);
for( int i = 0; h_vcTest[i]; i ++)
{
CString a;
::GetWindowText(h_vcTest[i], a.GetBuffer(a.GetLength()), 200);
if (a.Find("PtisPlus") != -1)
::ShowWindow(h_vcTest[i], SW_SHOWNORMAL);
}
}
}


//倒数第二个参数是运行目录 
ShellExecute(NULL, "open", "C:\\Program Files\\FIH\\PtisPlus\\vcTestUI\\vcTestUI.exe", "", "C:\\Program Files\\FIH\\PtisPlus\\vcTestUI",SW_SHOWNORMAL);


查看开机自启动项目
msconfig —> 选择启动 查看开机启动
1.注册表
2.计划任务
3.C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup


模拟鼠标键盘方式
1,keybd_event
2,SendInput()
3,PostMessage()
4,Hook消息
5,驱动发送按键


创建互斥量 可以实现只运行一个实例
WaitForSingleObject
第2个参数如果指定一个非零值,函数处于等待状态直到hHandle 标记的对象被触发,或者时间到了。
如果dwMilliseconds 为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。
如果dwMilliseconds 为INFINITE,对象被触发信号后,函数才会返回。


WM_LBUTTONDOWN是在左击客户区时响应; WM_NCLBUTTONDOWN是在左击非客户区时响应。


C++调用C extern "C" {}
C调用C++ 正常调用 C++代码中 用 extern "C"声明


开启SVN
svnserve -d -r D:/svn


单井号(#)
把传递过来的参数当成字符串进行替代
如下示例:
程序代码
#define display(name) printf(""#name"")
int main() 
{
  display(name);
}
输出:name


双井号(##)称为连接符
在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。
所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在参考编译原理。
假设程序中已经定义了这样一个带参数的宏:
程序代码
#define paster( n ) printf( "token" #n " = %d", token##n )
int token9 = 9;
现在在主程序中以下面的方式调用这个宏:
paster( 9 );那么在编译时,上面的这句话被扩展为:printf( "token" "9" " = %d", token9 );
注意到在这个例子中,paster(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。
结果就是在屏幕上打印出token9=9


为了避免同一个文件被include多次
在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
方式一: 1   #ifndef方式
    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 一些声明语句
    #endif
方式二:2   #pragma once方式
    #pragma once
    ... ... // 一些声明语句
    #ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会
被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
    #pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,
而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。
对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,
重复包含更容易被发现并修正。
   方式一由语言支持所以移植性好,方式二 可以避免名字冲突 


CString转换成数字
_tstoi((LPCTSTR)(xml.GetAttrib(strAttribName)));


编译时出现:WINVER not defined. Defaulting to 0X0501 (Windows XP and Windows .NET Server)
这个问题是因为没有指定工程要使用的平台SDK的版本。
Minimum system required Macros to define  
Windows Server 2003 family _WIN32_WINNT>=0X0502  
Windows XP _WIN32_WINNT>=0X0501  
Windows 2000 _WIN32_WINNT>=0X0500  
Windows NT 4.0 _WIN32_WINNT>=0X0400  
Windows Me _WIN32_WINDOWS=0X0490  
Windows 98 _WIN32_WINDOWS>=0X0410  
Internet Explorer 6.0 _WIN32_IE>=0X0600  
Internet Explorer 5.01, 5.5 _WIN32_IE>=0X0501  
Internet Explorer 5.0, 5.0a, 5.0b _WIN32_IE>=0X0500  
Internet Explorer 4.01 _WIN32_IE>=0X0401  
Internet Explorer 4.0 _WIN32_IE>=0X0400  
Internet Explorer 3.0, 3.01, 3.02 _WIN32_IE>=0X0300
解决办法:
属性,C/C++,命令行,附加项中添加 /D _WIN32_WINNT=0x0501 (因为我是在xp下工作的所以是0x0501)


uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)
原因:
CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和 DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。
当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误时,可能会出现以下 LNK2005 错误。
解决方法:
强制链接器按照正确的顺序链接库!
项目->属性->链接器->输入:附加依赖项 添加 uafxcwd.lib
注意:uafxcwd.lib 库是 Debug 版本的,Release 版本的是 uafxcw.lib


非MFC工程使用MFC库时的问题及解决办法
一、问题由来 
vc6和vc71的工程向导中都包含非MFC的工程,诸如win32 console project, win32 static library。非MFC工程创建时是不支持MFC特性的,
然后我们在处理实际问题时有时会用到MFC相关类,如Cstring, Cedit等等,这是很正常的。可能有人会说,为何不在一开始就创建MFC工程呢?
问题在于MFC工程会产生很多向导生成代码,如基于单文档的工程会有View,Doc等类,很多时候我们只需要一个空工程就可以了。
二、常见问题
非MFC工程使用MFC库时最常见的问题就是windows.h重复包含错误,具体如下:
fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>
三、解决办法
非MFC工程使用MFC库时,可参考以下步骤
1、工程设置中,将MFC的使用由原来的“使用标准windows库”改为“在共享DLL中使用MFC”(VC71)
如果是英文版,相关选项是:
Microsoft Foundation Classes: Use MFC in a shared dll, no using MFC(VC6)
NOTE:因为我用的是中文版的vc71,英文版的vc6.
2、头文件包含
不同的MFC类需包含的头文件是不一样的。
常用的类,如Cstring, Cedit 等,包含afxwin.h就可以了
如果不清楚包含什么头文件的话,可以同msdn进行查询,msdn中,对于MFC类的介绍中,都会给出相应的header file requirement.
3、#include 语句一定要写在首行
这一点很重要,通常出现前面讲到的windows.h重复包含错误,都是因为#include 语句没有写在首行。
另外还要注意的是,如果#include语句是在一个头文件里,那么对应头文件的包含也要写在首行。示例如下:
test.h文件的内容如下:
#include <afxwin.h> //保证该语句在首行
test.cpp的文件内容如下:
#include “test.h” //同样也要保证该语句在首行


CArray::InsertAt
第一个版本在数组的特定索引上插入一个元素(或元素的多个拷贝)。在此过程中,移动(通过索引值的增加)此索引上原有的元素,
并且移动所有在其后的元素。
第二个版本由另一个CArray收集插入所有元素,从nStartIndex位置开始。SetAt函数替换一个特定数组元素,不移动任何元素。 
CArray中元素是指针的时候 应该先delete指针


使用RichEdit控件之前,还没有为这个控件做好准备,解决办法是手动添加做准备语句,在应用程序类的InitInstance函数体内添加以下语句 AfxInitRichEdit();
 
OD修改之后保存exe方法
在代码区(即CPU - 主线程,模块)点mouse右键,选择"编辑 ->复制到可执行文件",然后选择你要复制的具体修改部分
然后ollydbg会打开一个新的窗口,窗口的标题就是那个你调试的文件名,在这个新
窗口中点mouse右键,选择“保存文件”,输入一个文件名即可保存了


获取RichEdit的文本 用GetWindowText获取不到的时候可以用以下方法
TCHAR c[1000] = {0};
SendMessage((HWND)b, WM_GETTEXT, 1000, (LPARAM)c);


屏蔽Ctrl+T
if ((wParam == 'T') && (GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState('T') & 0x8000)){}// CTRL+T
&与操作,&0x8000就是判断这个返回值的high-order bit(高位字节);如果high-order bit是1,则是按下状态,否则UP状态
::GetKeyState()只能在键盘消息处理程序中使用,因为它只有在线程从消息队列中读取键盘消息时才会报告被查询键的状态,
如果需要在键盘消息处理程序以外查询按键状态,则需要使用::GetAsyncKeyState()来代替.


对话框型程序的窗口隐藏:
1.在OnInitDialog()中加上ShowWindow(SW_HIDE),无效。
2.在OnPaint()中加上ShowWindow(SW_HIDE),有效,但会闪烁。
3.重载虚函数WindowProc():
LRESULT CTestDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam){
    ShowWindow(SW_SHOW);
    return CDialog::DefWindowProc(message, wParam, lParam);
}
4.在OnInitDialog()中使用SetWindowPlacement():
GetWindowPlacement(&m_wp); // 恢复时用
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);


添加托盘程序~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1) 在所要处理的Frame或Dialog中添加保护成员变量
protected:  
    NOTIFYICONDATA m_tnid;
2) 为对应的Frame 或Dialog 添加 WM_CREATE 消息函数,在对应实现函数中添加托盘生成代码
在对应的类声明文件中定义消息 ,并在OnCreate 函数中Return 之前添加代码
//对应的类声明文件中定义消息   
#define MYWM_NOTIFYICON WM_USER+1   
//OnCreate 函数中return 之前添加托盘生成代码   
m_tnid.cbSize=sizeof(NOTIFYICONDATA);   
m_tnid.hWnd=this->m_hWnd;   
m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;   
m_tnid.uCallbackMessage=MYWM_NOTIFYICON;      
//用户定义的回调消息    
CString szToolTip;   
szToolTip=_T("托盘图标实例"); //鼠标在托盘上移动时显示文本   
_tcscpy(m_tnid.szTip, szToolTip);   
m_tnid.uID=IDR_MAINFRAME;   
HICON hIcon;   
hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);   
m_tnid.hIcon=hIcon;   
::Shell_NotifyIcon(NIM_ADD,&m_tnid);   
if(hIcon)::DestroyIcon(hIcon);
3) 编写消息处理函数 ----为了处理图标回调消息,如鼠标左键双击、鼠标右键单击消息,我们重载WindowProc()函数。此外,我们还希望在主框架窗口最小化时图标不在任务栏空白区出现,在此函数中同时作相应处理。
别忘了编辑属于你自己的菜单,这里暂且使用 IDR_RIGHT_MENU 标志
LRESULT ***Frame/*or Dialog*/::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)      
{   
 switch(message){   
  case MYWM_NOTIFYICON:      
   //如果是用户定义的消息    
   if(lParam==WM_LBUTTONDBLCLK)   
   {   
    //鼠标双击时主窗口出现    
    AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);   
   }   
   else if(lParam==WM_RBUTTONDOWN){      
    //鼠标右键单击弹出菜单    
    CMenu menu;   
    menu.LoadMenu(IDR_RIGHT_MENU);      
    //载入事先定义的菜单    
    CMenu* pMenu=menu.GetSubMenu(0);   
    CPoint pos;   
    GetCursorPos(&pos);   
    pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());   
   }   
   break;   
  case WM_SYSCOMMAND:      
   //如果是系统消息    
        switch(wParam){  
          case SC_MINIMIZE:  
              //接收到最小化消息时主窗口隐藏    
              ShowWindow(SW_HIDE);   
              return 0;  
              break;  
          case SC_CLOSE :  
              ::Shell_NotifyIcon(NIM_DELETE,&m_nid); //关闭时删除系统托盘图标   
              break;  
        }   
   break;   
 }   
 return CFrameWnd/*or CDialog*/::WindowProc(message, wParam, lParam);  //其实就是调用父类的消息处理函数   
}  至此,托盘图标程序的常规功能我们均已实现。我们还可以通过Shell_NotifyIcon()函数的调用实现不同状态下图标的改变


获取文件属性 例如修改时间
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; // 文件创建时间
FILETIME ftLastAccessTime; // 文件最后一次访问时间
FILETIME ftLastWriteTime; // 文件最后一次修改时间
DWORD nFileSizeHigh; // 文件长度高32位
DWORD nFileSizeLow; // 文件长度低32位
DWORD dwReserved0; // 系统保留
DWORD dwReserved1; // 系统保留
TCHAR cFileName[ MAX_PATH ]; // 长文件名
TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名
} WIN32_FIND_DATA, *PWIN32_FIND_DATA; 
WIN32_FIND_DATA ffd_ENG, ffd_OPE;
FindFirstFile("C:\\ad.dat", &ffd_ENG);


比较FileTime
LONG CompareFileTime(
  const FILETIME* lpFileTime1, 
  const FILETIME* lpFileTime2 
);


HANDLE hFile = FindFirstFile(temp, &ffd_ENG);
FindClose(hFile);


设置MFC对话框背景图片 
在OnPaint()函数中:
if (IsIconic())
   {……}
else
{
       //CDialog::OnPaint();把这个注释掉,不调用基类的OnPaint()
       CPaintDC dc(this);
       CDC memdc;
       memdc.CreateCompatibleDC(&dc);//创建兼容DC
       CBitmap bkg;
       bkg.LoadBitmap(这里写你导入位图的ID号);//载入位图
       BITMAP bkginfo;
       bkg.GetBitmap(&bkginfo);//获取位图信息
       memdc.SelectObject(&bkg);
       RECT rect;
       GetWindowRect(&rect);//获取对话框信息
       dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,0,0,bkginfo.bmWidth,bkginfo.bmHeight,SRCCOPY);
  //拉伸的贴图 如果不拉伸贴图 可以用BitBlt绘制
 }


消息处理 可以使CStatic控件的背景色设为透明
HBRUSHCTestDllDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor) 

       HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor); 
       if(nCtlColor==CTLCOLOR_STATIC) 
       {
              pDC->SetBkMode(TRANSPARENT); 
              hbr=(HBRUSH)::GetStockObject(NULL_BRUSH); 
       }
       return hbr;
}
当刷新CStatic的时候 字体会重叠 解决方法:在改变控件的时候刷新控件下面窗口的一部分区域
RECT temp;
GetDlgItem(IDC_ONLINE)->GetWindowRect(&temp);
ScreenToClient(&temp);
InvalidateRect(&temp);
解决重叠的问题之后 控件的刷新会闪烁 为了不闪烁 可以不去擦除背景
BOOL CLockScreenDlg::OnEraseBkgnd(CDC* pDC) 
{
// TODO: Add your message handler code here and/or call default

//return CDialog::OnEraseBkgnd(pDC);
return TRUE;
}


UpdateData影响的是整个对话框
慎用 可以用SetDlgItemText(IDC_TIME, m_SystemTime);代替


#include <time.h>
time_t t = time(0); 
char tmp[64]; 
strftime(tmp, sizeof(tmp), "%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t) ); 


MFC程序窗体周围会有条线,去掉线的方法
窗体 -> 属性 ->Styles ->Border ->改成None(默认是Dialog Frame)


::ShowWindow(h_vcTest[i], SW_SHOWNOACTIVATE);还原窗口上一次的状态来显示窗口


1) 显示桌面:
很多软件有显示桌面的功能, 并且大家的方法都是遍历窗口, 然后让它们最小化, 其实 win系统给咱们了一个非常方便的WIN键(就是键盘上在CTRL键和ALT键之间的那个带win标志的按键), 利用它, 可以轻松的完成显示桌面的功能.
keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event('M', 0, 0 ,0);
keybd_event('M', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);
2) 实现快速的全选
很多的时候,比如listctrl实现全选,你可以用listctrl循环设置每一项的状态为选中,多罗索的事情呀。用快捷键试一试CTRL+A,其他的快捷键一样的用法,呵呵,你知道怎么办了吧?
keybd_event(VK_CONTROL, (BYTE)0, 0 ,0);
keybd_event('A',(BYTE)0, 0 ,0); //此处可以用 'A', (BYTE)65, 用'a'不起作用.
keybd_event('A', (BYTE)0, KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL, (BYTE)0, KEYEVENTF_KEYUP,0);
3) 执行某些特殊的键,比如数字键,大小写,下面是数字键的例子
bool bState=true; //true为按下NumLock,false反之
BYTE keyState[256];
GetKeyboardState((LPBYTE)&keyState);
if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
(!bState && (keyState[VK_NUMLOCK] & 1)) )
{
// Simulate a key press
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | 0,
0 );
// Simulate a key release
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0);
}
4) 你想CTRL+ALT+DELETE三键一起按下,
keybd_event(VK_CONTROL, 0, 0 ,0);
keybd_event(VK_MENU,0, 0 ,0);
keybd_event(VK_DELETE,0, 0 ,0);


keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_MENU,0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_DELETE,0, KEYEVENTF_KEYUP ,0);
呵呵,这样不会成功呀,因为这几个键直接是操作系统来截获执行的,而模拟键盘只能发向应用程序,所以这种方法不行的(想显示锁定对话框,用 LockWorkStation();)
5) Window2000/NT/XP已经不提倡用这个函数了,上面的方法只是为了让大家开阔一下思路,怎么替代呢,呵呵,看下面,所以上面的所有代码都可以用这个来完成
//2000下用这个代替 ,包含 "winable.h"
INPUT input[4];
memset(input, 0, sizeof(input));
input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;
input[0].ki.wVk = input[3].ki.wVk = VK_LWIN;
input[1].ki.wVk = input[2].ki.wVk = 'R';
//接下来释放它,这一点很重要。
input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;
input[0].ki.time = input[1].ki.time = input[2].ki.time = input[3].ki.time = GetTickCount();
SendInput(4, input, sizeof(INPUT));


所有窗口最小化
HRESULT sc; 
IShellDispatch *pShellDisp = NULL; 
CoInitialize(NULL); 
sc = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_SERVER, IID_IDispatch, (LPVOID*)&pShellDisp); 
if(FAILED(sc)) 

CoUninitialize(); 
return; 
}
pShellDisp->MinimizeAll(); 
pShellDisp->Release(); 
CoUninitialize();


使用CButtonST的方法
BtnST.cpp
BtnST.h
BCMenu.cpp
BCMenu.h
加进代码 然后修改按钮的类即可
CButtonST::DrawTransparent()可以让按钮透明显示窗体 让按钮的颜色和背景一样


设置控件字体
1、改静态文体的ID,如:IDC_STATIC1 
2、添加一个Edit控件,建立一个关联的控件m_editControl。 
3、在OnInitDialog中添加如下代码:
CFont * f; 
f = new CFont; 
f->CreateFont(16, // nHeight 
0, // nWidth 
0, // nEscapement 
0, // nOrientation 
FW_BOLD, // nWeight 
TRUE, // bItalic 
FALSE, // bUnderline 
0, // cStrikeOut 
ANSI_CHARSET, // nCharSet 
OUT_DEFAULT_PRECIS, // nOutPrecision 
CLIP_DEFAULT_PRECIS, // nClipPrecision 
DEFAULT_QUALITY, // nQuality 
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
_T("Arial")); // lpszFac 
GetDlgItem(IDC_STATIC1)->SetFont(f); 


监听注册表工具Regmon


一定要初始化。。int a;//如果a不初始化 可能被带入某个函数导致函数处理失败
字符串 char a[MAX_PATH] = {0};


获取当前系统版本 是什么语言。
#include <Winnls.h>
#pragma comment(lib,"Kernel32.lib")
LANGID lid = GetSystemDefaultLangID();
switch (lid)
{
case 0X0804:
//MessageBox(_T("Chiese"));
break;
case 0x0409:
//MessageBox(_T("English"));
break;
}


//终止进程
DWORD PID;
FindProcessByName("vcTestUI.exe", PID); 
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, PID);
TerminateProcess(hProcess,0);


AfxGetApp()->m_pMainWnd->GetWindowRect(&r);
获取主程序的指针 以及获取主窗口


模态对话框
nRet = aboutDlg.DoModal();
非模态对话框
CTest *pdlg=new CTest();
pdlg->Create(IDD_DIALOG1,this);
pdlg->ShowWindow(SW_SHOW); //没有这句话对话框将不会显示


屏蔽Esc 回车
BOOL CLockScreenDlg::PreTranslateMessage(MSG* pMsg) 
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN) 

if((pMsg->wParam==VK_RETURN) || (pMsg->wParam == VK_ESCAPE))
{
return TRUE; 
        }
}
return CDialog::PreTranslateMessage(pMsg);
}
void CLockScreenDlg::OnClose() 
{
// TODO: Add your message handler code here and/or call default
//CDialog::OnClose();
}


app设置背景颜色
SetDialogBkColor(RGB(0,0,255),RGB(0,255,0)); 


模拟命令行打开应用程序ShellExecute


屏蔽某一控件的输入法
#include <imm.h> 
#pragma comment(lib, "imm32.lib")
HIMC m_hImc;
void CDisableInputDlg::OnOK() 
{
DisableIME();
}
void CDisableInputDlg::OnButton1() 
{
EnableIME();
}
void CDisableInputDlg::DisableIME() // Function for Disabling IME
{
HWND hWnd = GetDlgItem(IDC_EDIT1)->m_hWnd;
if (hWnd && IsWindow(hWnd))
{
m_hImc = ImmGetContext(hWnd);// Get input context for backup.
if (m_hImc) // Remove association the testing
ImmAssociateContext(hWnd, NULL);
ImmReleaseContext(hWnd, m_hImc);// Release input context
::SetFocus(hWnd);
}
}
void CDisableInputDlg::EnableIME() // Function for Enabling IME
{
HWND hWnd = GetDlgItem(IDC_EDIT1)->m_hWnd;
if (hWnd && IsWindow(hWnd))
{
if (m_hImc) // Enable IME
{
ImmAssociateContext(hWnd, m_hImc);// Associate the input context with testing window
m_hImc = NULL;
}
::SetFocus(hWnd);
}
}


CoInitialize是 Windows以单线程的方式创建com对象。
应用程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。   
CoInitialize和CoUninitialize必须成对使用
不使用CoInitialize Dll加载不进来导致崩溃


m_pic.SubclassDlgItem(IDC_PIC,this);
Subclass(子类化)是MFC中最常用的窗体技术之一。子类化完成两个工作:
一是把窗体类对象attach到一个windows窗体实体中(即把一个窗体的hwnd赋给该类)。
另外就是把该类对象的消息加入到消息路由中,使得该类可以捕获消息。


 
为使托盘应用程序退出时图标消失 映射WM_DESTROY消息 在OnDestroy()函数中加入:
::Shell_NotifyIcon(NIM_DELETE,&m_tnid); 


此项目已经过期原因
这个bug的原因是Visual studio 2010认为项目中的被删除的文件是过期的,比如项目中的某个头文件,这个头文件已经被删除,Visual studio 2010找不到这个头文件,就认为它是过期的,所以每次调试VS都认为项目是过期的,需要先编译

char *name;
name = new char[strlen(pname+1)];    //输入时候分配
strcpy(name , n);
delete []name;

函数的缺省值必须从右向左提供
student(char *p="玫瑰",int x)就是错误的
student(char *p="玫瑰",int x=0)就是正确的

友元函数的定义体不能放再类中;友元函数的定义一定要放在类外!

成员常量的赋值 
对于带有const数据成员的对象,程序员一定要给构造函数初始值
若有多个const数据成员,只需将他们放在构造函数之后,用逗号隔开
构造函数(类的内部实现。。)   employer():ID(410086){}

int *a()
{
int n;
cin>>n;
int *a;
a=new int[n];
for(int i=0;i<n;i++)
{
a[i]=n;
}
return a;//a会不会造成泄露//如果泄露,应该如何处理泄露
}用new分配的内存,返回后不会被释放,所以,没有出错,但是在【主程序】里面你要负责【释放这部分内存】,否则内存泄露  

动态数组的分配
int n;  cin>>n;  int *a;   a=new int[n];
数组内存释放  
一维数组 delete []a;  
二位数组 delete [4]b;

ATL,
Active Template Library活动模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。

COM
COM,即组件对象模型,是关于如何建立组件以及如何通过组件建立应用程序的一个规范,说明了如何可动态交替更新组件。

int n,sum=0;  //输入一个非数字可以置位failbit,从而结束循环,当然这是一个非正常退出
while(cin>>n)  //cin>>n返回的也是一个cin对象,当一个cin对象作为条件选择、循环等的控制表达式时,编译器会将其转换为真值表达式,如果cin的iostate为goodbit,则这个真值表达式的结果为真,否则为假。
string word;
while(cin>>word)
{
text.push_back(word);//按ctrl+z时候结束
}

#ifndef x//先测试x是否被定义过
#define x//如果没有定义x并执行下面的语句(包含进来进行处理)
...
#endif//如果已经定义了则执行#endif后面的语句
这是宏定义的一种,它可以根据是否定义了一个变量来进行分支选择,一般用于调试等等
条件指示符#ifndef最主要的目的是为了防止头文件被重复包含和编译,#include指令使包含的文件内容被编译,如果多个文件都包含了stdio库,就相当于这个库被编译了多次,条件编译就是为了防止多个文件被多次编译
VC里面和|  #if ! defined ... #define ... #endif|
|#pragma once|是等价的

在VC++6.0中添加外部的头文件方法:
工程-->添加工程-->files-->所要添加的文件

exit(0);exit(1);return; return 0;return 1;区别

string a="a"; sizeof(a)=16;为什么一直都是16?

extern用在变量或者函数前,表示变量或者函数的定义在别的文件中,提示编译器遇到此变量在其他模块中寻找定义。

CALLBACK,WINAPI,AFXAPI都是 _stdcall (利用宏定义)
( _stdcallC/C++函数调用法从右向左自动清栈windows规定,凡是由它负责调用的函数,必须为_stdcall
( _cdeclC调用从右向左手工清栈如果没有显式声明的话,函数的默认调用方法   _cdecl

enum color{w,b = 100,r,bl,green=300};
w=0;r=101;bl=102;
  
srand( (unsigned)time( NULL ) );设置种子
printf( "  %6d\n", rand() );取随机数

VC编译器错误纠正: error LNK2005: xxx already defined in libcmt.lib(xxx.obj) MSVCRT.lib
Project Settings:-> Configration Properties -> Linker 链接时加入参数 /FORCE:MULTIPLE

TCHAR strErrorCode[10] = {0};

sprintf(strErrorCode, "0x%04X", iErrorCode);
表示十六进制 例如0x1EF3

GetPrivateProfileString ini文件的路径必须是完整的路径名

获取当前路径
CString strPath;
GetModuleFileName(NULL,strPath.GetBufferSetLength(MAX_PATH+1), MAX_PATH);
strPath.ReleaseBuffer ();
int iPos = strPath.ReverseFind ('\\');
strPath = strPath.Left (iPos);

内存泄漏检测工具  leakdiag

派生类中CString也会泄露?
解决方法一:将基类的构造函数虚拟化 即可解决virtual ~CBase(){}
解决方法二:将#include <afx.h>换成#include <atlstr.h>即可解决

VS2008重置环境
Microsoft Visual Studio 2008 -> Visual Studio Tools -> Visual Studio 2008命令提示
devenv.exe /setup /resetuserdata /resetsettings
然后重启VS2008

VS提示没有可用于当前位置的源代码:
将工具->选项->调试->常规->去掉“要求源文件与原始版本完全匹配

Visual Studio试用版的评估期已经结束。。解决方法
在“控制面板”中启动“添加删除程序”,选中Vs2008,点击“更改、删除”, 
输入序列号:PYHYP-WXB3B-B2CCM-V9DX9-VDY8T

普通DX的方法不能截取通过Overlay硬件加速的视频图像的

获取密码框密码
char strBuf[50 + 1] = {0};
LONG PassToChar = SendMessage(TemHwnd,EM_GETPASSWORDCHAR,0,0);//获取密码字符
PostMessage (TemHwnd,EM_SETPASSWORDCHAR,0,0);//取消密码字符
Sleep (60);
SendMessage (TemHwnd,WM_GETTEXT,(WPARAM)50,(LPARAM)strBuf);//获取真实密码
PostMessage (TemHwnd,EM_SETPASSWORDCHAR,PassToChar,0);//还原密码字符

当使用MoveWindow或者SetWindowPos 导致窗口分裂成两个窗口可以重新画一遍
SendMessage(hWnd, WM_PAINT, 0, 0);

C++设置访问剪切板文字
//设置剪贴板未银行卡号
void SetDataToClip()
{   
//打开剪贴板   
if(OpenClipboard(NULL) == FALSE)  
{
return; 
}
if(EmptyClipboard() == FALSE)
{
CloseClipboard();
return;
}
TCHAR strText[40] = "6111111111111111111";   

//分配全局内存    
HGLOBAL hMen = GlobalAlloc(GMEM_MOVEABLE, ((strlen(strText)+1)*sizeof(TCHAR)));    

if (!hMen)   
{
CloseClipboard();   
return;         
}   

// 把数据拷贝考全局内存中  锁住内存区    
LPSTR lpStr = (LPSTR)GlobalLock(hMen);   
if(lpStr == NULL)
{
GlobalFree(hMen);
CloseClipboard();
return;
}

// 内存复制   
memcpy(lpStr, strText, ((strlen(strText))*sizeof(TCHAR)));    
// 字符结束符    
lpStr[strlen(strText)] = (TCHAR)0;   
// 释放锁    
GlobalUnlock(hMen);   

// 把内存中的数据放到剪切板上   
if(FALSE == SetClipboardData(CF_TEXT, hMen))
{
GlobalFree(hMen);
CloseClipboard();
return;
}
CloseClipboard();
return;   
}

netsh winsock reset
解决软件引起的网络无法连接(软件冲突)、

隐藏主窗口代码
1.ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);
隐藏任务栏窗口 还可以这样
DWORD dwExStyle = GetWindowLong(hDlg, GWL_EXSTYLE);
dwExStyle |= WS_EX_TOOLWINDOW;
SetWindowLong(hDlg, GWL_EXSTYLE, dwExStyle);
2.处理WM_NCPAINT即可
ShowWindow(SW_HIDE); 

LIBCMTD.lib与libcpmtd冲突的解决方法。 .
编译工具:VS2008
项目--〉属性--〉配置属性--〉链接器--〉输入--〉附加依赖项--〉Nafxcwd.lib Libcmtd.lib
项目--〉属性--〉配置属性--〉链接器--〉输入--〉忽略特定库--〉Nafxcwd.lib;Libcmtd.lib

string 转 CString 
CString.format("%s", string.c_str()); 
CString 转 string
string s(CString.GetBuffer()); 

Shell_NotifyIcon(NIM_MODIFY ,&amp;nid)失败的问题 .
 其实问题很简单,当你指定了nid.uID之后,你就不能再次指定其它值,尽管你觉得第二次用的是IDR_ICON1啊!
http://blog.csdn.net/xiaodao1986/article/details/2956486

隐藏对话框
//隐藏任务栏图标
DWORD dwExStyle = GetWindowLong(g_hDlg, GWL_EXSTYLE);
dwExStyle |= WS_EX_TOOLWINDOW;
SetWindowLong(g_hDlg, GWL_EXSTYLE, dwExStyle);
//隐藏主窗口
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(g_hDlg, &wp);
显示对话框
//显示主窗口
WINDOWPLACEMENT wp; 
wp.length=sizeof(WINDOWPLACEMENT); 
wp.flags=WPF_RESTORETOMAXIMIZED; 
wp.showCmd=SW_SHOW; 
SetWindowPlacement(g_hDlg, &wp); 
SetDlgItemText(g_hDlg, IDC_EDIT1, g_ClientName);
SetDlgItemText(g_hDlg, IDC_IPADDRESS1, g_ServerIP);
SetWindowPos(g_hDlg, HWND_NOTOPMOST, g_Rect.left, g_Rect.top,g_Rect.right - g_Rect.left,g_Rect.bottom - g_Rect.top,SWP_SHOWWINDOW);
(在Ini之中加GetWindowRect(g_hDlg, &g_Rect); )

NOTIFYICONDATA IconData;
IconData.hWnd = g_hDlg;
IconData.uID = IDI_ICON1;
IconData.hIcon = LoadIcon(g_hIns,MAKEINTRESOURCE(IDI_ICON3));
IconData.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
IconData.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
IconData.uCallbackMessage = WM_NOTIFY_ICON;
//鼠标在托盘上移动时显示文本 
CString szToolTip;
szToolTip.Format(_T("猎宝鼠键共享正在尝试连接服务器%s"), g_strServerIP);
_tcscpy(IconData.szTip, szToolTip);
Shell_NotifyIcon(NIM_ADD,&IconData);
注意:IconData.uID决定了应用程序的大图标

拖动窗体
OnLButtonDown事件中添加如下一句代码也可以实现
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));

半透明
//加入WS_EX_LAYERED扩展属性
SetWindowLong(g_Client.m_hSmallDlg,GWL_EXSTYLE,GetWindowLong(g_Client.m_hSmallDlg,GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *SLWA)(HWND,COLORREF,BYTE,DWORD);
SLWA pFun = NULL;
//取得SetLayeredWindowAttributes函数指针 
pFun = (SLWA)GetProcAddress(hInst,"SetLayeredWindowAttributes");
if(pFun)
{
pFun(g_Client.m_hSmallDlg,0,160,2);//160为透明度
}
FreeLibrary(hInst); 
}

//圆形不规则窗口
CRgn rgn;
rgn.CreateEllipticRgn(0, 0, 63, 63); //具体数自己定
SetWindowRgn(g_Client.m_hSmallDlg, HRGN(rgn), true); 
rgn.DeleteObject();

鼠标穿透窗口 点击下一层窗口代码
LONG dwNewLong = GetWindowLong(g_Client.m_hSmallDlg, GWL_EXSTYLE);   
dwNewLong |=  WS_EX_TRANSPARENT|WS_EX_LAYERED;   
SetWindowLong(g_Client.m_hSmallDlg, GWL_EXSTYLE, dwNewLong);

ShowCursor()显示和隐藏鼠标有计数器 ShowCursor的返回值显示计数器的个数
返回值大于等于0表示显示鼠标
返回值小于0    表示隐藏鼠标
if ((bool)wParam)//显示鼠标
{
while (ShowCursor((bool)wParam)<0)
{
}
}
else//隐藏鼠标
{
while (ShowCursor((bool)wParam)>=0)
{
}
}

vs2008中将一个项目中的资源复制到另一个项目的资源中
做新项目时,在原来项目的基础上做一些调整,会用到原来的项目中的一些资源,比如对话框、toolbar等,需要复制到新项目中以减少劳动量和误差
可以直接在一个解决方案中打开这两个项目,这两个项目的资源都会显示在Resource view视图中,直接对原来的项目的资源Ctrl+C,然后再在新项目的资源中Ctrl+V即可

改变对话框背景色
case WM_CTLCOLORDLG:
{
   HBRUSH g_hbrBackground = CreateSolidBrush(RGB(252,251,159));
   return (LONG)g_hbrBackground;
}

SetForegroundWindow
该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程

想菜单项发送按键消息
(spiderhwnd = FindWindow(vbNullString, "蜘蛛");m1 = GetMenu(spiderhwnd);)
HMENU hMenu1 = GetSubMenu(hMenu, 9);
UINT id = GetMenuItemID(hMenu1, 17);
SendMessage(hwnd, WM_COMMAND, id, 0);

CString g_strData = _T("qq");
g_strData.Format("%s", g_strData);
有时候会崩溃,请不要这样写

正斜杠/slash 表示除法,分隔。在windows系统中通常用来分隔命令行参数,/表示选项等。不能作为文件名。
而在unix系统中,/表示目录。由于web遵循unix命名,所以在网址(URL)中,/表示目录。
反斜杠\backslash,在windows系统中用来表示目录。

关于在线程中使用AfxGetMainWnd()出错的问题.
AfxGetMainWnd()得到的是当前线程的主窗口(如果有的话).
因为主窗口是属于主线程的,所以想得到主窗口HWND值,
只能在主线程中用AfxGetMainWnd(),但要不是处在主线程中,
AfxGetMainWnd()可能是从当前线程查询主窗口的。但好像
AfxGetMainWnd()不能跨线程,故要出错.要想在线程中使用
主窗口的HWND值,可以把主窗口的HWND值传给线程.也
可以用AfxGetApp()先取得主线程,再通过CWinThread的类成
员m_pMainWnd获得主窗口(AfxGetApp()->m_pMainWnd->m_hWnd)

1、修改对话框属性,在Extended Styles标签页中勾选"Accept files" 选项;
2、增加对话框窗口的WM_DROPFILES消息响应函数;
   注意,默认的对话框程序中屏蔽了许多Window消息,如果你在默认的工程中去找这个Events,你会发现你找不到WM_DROPFILES消息。此时,打开MFC ClassWizard,切换到Class Info标签页,选择左下方的Message filter为Window即可。
3、在相应函数void C**Dlg::OnDropFiles(HDROP hDropInfo) 中,添加如下代码可以获取拖入的文件的完整文件名:
//拖拽文件到窗口
char* pFilePathName = new char[512];
::DragQueryFile(hDropInfo, 0, pFilePathName, 512);  // 获取拖放文件的完整文件名
m_strFilePathName.Format("%s", pFilePathName);
::DragFinish(hDropInfo);   // 注意这个不能少,它用于释放Windows 为处理文件拖放而分配的内存
delete[] pFilePathName;

c++ 内存泄漏(Detected memory leaks)解决
最近看到关于内存泄漏的查找的文章,供大家学习:
Detected memory leaks!Dumping objects ->{98500} normal block at 0x05785AD0, 152 bytes long. Data: << N N x 7 > 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00 Object 
dump complete. 而且每次退出都是一样的.泄漏的内存块都是98500.
解决方法: 在程序开始启动的地方(足够前的地方,只要在泄漏的内存分配的前面)使用代码:
_CrtSetBreakAlloc(98500); //98500为上面内存泄漏的块号.

创建文件夹以及子文件夹
if(!PathFileExists(_T("D:\\ZDJY\\Tem"))) SHCreateDirectoryEx(NULL, _T("D:\\ZDJY\\Tem"), NULL);

HKEY hKey;
RegCreateKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\IFSoft\\Ssjx\\Settings\\shumen_cn"), &hKey);
RegSetValueEx(hKey, _T("fw"), 0, REG_SZ, (BYTE *)m_TradeOrderInfo.m_strGameArea.GetBuffer(), m_TradeOrderInfo.m_strGameArea.GetLength());
DWORD dwType = REG_SZ;
DWORD dwLength = MAX_PATH;
CString strBuf = _T("");
RegQueryValueEx(hKey, _T("fw"),NULL, &dwType, (LPBYTE)strBuf.GetBufferSetLength(MAX_PATH), &dwLength);//dwLength一定要初始化一个足够大小的值
strBuf.ReleaseBuffer();
RegCloseKey(hKey);

WritePrivateProfileString
如果ini文件不存在就会自己创建

fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h" 解决办法
你可以单独关闭掉此文件的"使用预编译头"的选项.
右键选择该文件->属性->预编译头,
把它取消掉

如何让TCP服务器只accept指定IP地址的connect? 
setsocketopt 设置 SO_CONDITIONAL_ACCEPT, 让回调函数返回后WSAAccept才确认连接。WSAAccept的回调函数中得到对方IP,然后通过arp来获取对方MAC即可。

VS生成后事件 如果添加多条事件 中间无需分号 只需要空格

修改lib生成目录 属性->链接器->高级->导入库

//程序启动一次之后必须重启才能启动第二次
int iLastTime = 0;
iLastTime = GetPrivateProfileInt("TimeConfig","LastTime",0,strConfigPath);
CTime BeginTime(2015, 1, 1, 0, 0, 0);
CTimeSpan TimeSpan = CTime::GetCurrentTime() - BeginTime;
LONGLONG iSecond = TimeSpan.GetTotalSeconds();
if(iSecond - iLastTime < GetTickCount()/1000){AfxMessageBox("请重启机器");}
//启动完成时候写入此次启动的时间差
WritePrivateProfileString("TimeConfig","LastTime",iSecond,strConfigPath);

cout << "int 类型能存储的最大值和最小值" << endl;  
    cout << "INT_MAX = " << INT_MAX << endl;  
    cout << "INT_MIN = " << INT_MIN << endl;  
    cout << "long 类型能存储的最大值和最小值" << endl;  
    cout << "LONG_MAX = " << LONG_MAX << endl;  
    cout << "LONG_MIN = " << LONG_MIN << endl;  
    cout << "long long 类型能存储的最大值和最小值" << endl;  
    cout << "LONG_LONG_MAX = " << LONG_LONG_MAX << endl;  
    cout << "LONG_LONG_MIN = " << LONG_LONG_MIN << endl;  
    cout << "float 类型能存储的最大值和最小值" << endl;  
    cout << "FLT_MAX = " << FLT_MAX << endl;  
    cout << "FLT_MIN = " << FLT_MIN << endl;  
    cout << "double 类型能存储的最大值和最小值" << endl;  
    cout << "DBL_MAX = " << DBL_MAX << endl;  
    cout << "DBL_MIN = " << DBL_MIN << endl;  

某个区域BitBlt画过图之后 如何擦除?
CRect TempRect;
::GetWindowRect(GetDlgItem(IDC_STATIC_BEFORE)->m_hWnd, &TempRect);
ScreenToClient(&TempRect);//Screen(屏幕坐标) 到 Client(客户区坐标)的转换
InvalidateRect(TempRect, TRUE);
RedrawWindow(TempRect);

Edit控件属性里 按回车换行 把Multiline和Want Return两项都选成True
如果想使 超过边界(一定字数)自动换行显示 (实际上还是一行) 则Edit控件属性里 Multiline 选成True ,Auto HScroll选成False(不打钩)

隐藏java命令的窗口 用javaw代替java

程序中使用命令行
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
//隐藏运行窗口
//si.dwFlags = STARTF_USESHOWWINDOW;
//si.wShowWindow = SW_HIDE;
ZeroMemory( &pi, sizeof(pi) );
if(!CreateProcess(NULL, strCmd.GetBuffer(), NULL, NULL, false, 0, NULL, m_strCurrentDirectory + _T("\\手机模拟器运行程序\\KEmulator"), &si, &pi))
{
strError.Format(_T("创建模拟器进程失败 命令【%s】"), strCmd);
PrintMsg(strError);
return false;
}
//等待进程结束
//WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

//光标定位到Edit最后一行
((CEdit*)GetDlgItem(IDC_EDIT_LOG))->LineScroll(strTemp.GetLength());

//读取命令行返回值 - 匿名管道
HANDLE PipeReadHandle,PipeWriteHandle;
SECURITY_ATTRIBUTES SecurityAttributes;
SecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);  
SecurityAttributes.lpSecurityDescriptor = NULL;  
SecurityAttributes.bInheritHandle = TRUE;
if (!CreatePipe(&PipeReadHandle, &PipeWriteHandle, &SecurityAttributes, 0)) //创建匿名管道
{
PrintMsg(_T("创建匿名管道失败"));
return false;
}
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
ZeroMemory( &StartupInfo, sizeof(StartupInfo) );
StartupInfo.cb = sizeof(StartupInfo);
StartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
StartupInfo.wShowWindow = SW_HIDE;
StartupInfo.hStdError = PipeWriteHandle;//将管道的写端交给子进程  
StartupInfo.hStdOutput = PipeWriteHandle;
ZeroMemory( &ProcessInfo, sizeof(ProcessInfo) );
if(!CreateProcess(NULL, strCmd.GetBuffer(), NULL, NULL, true, 0, NULL, strCurrentDirectory, &StartupInfo, &ProcessInfo))
{
PrintMsg(_T("运行失败:")+strCmd);
CloseHandle(PipeWriteHandle);  
CloseHandle(PipeReadHandle);
return false;
}
if(bWaitProcessExit)
{
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

char pBuffer[4096] = {0};
DWORD dwRead;
ReadFile(PipeReadHandle, pBuffer, sizeof(pBuffer)-1, &dwRead, NULL); //读取内容  
PrintMsg(_T("【执行命令】")+strCmd);
PrintMsg(pBuffer);
}
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(PipeWriteHandle);
CloseHandle(PipeReadHandle);

ComboBox不想让用户自己输入内容而只能选择combobox里的项,就将DropDown属性设为DropDownList

内存泄漏检测
程序开始:#define _CRTDBG_MAP_ALLOC
程序结束:_CrtDumpMemoryLeaks();
如果包含若干出口则只需在开头调用_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );程序退出时自动调用 _CrtDumpMemoryLeaks

因为键盘鼠标是用驱动来模拟的
keyevent 内部调用的是NtSendIntput
NtSendIntput有可能被hook
这样keyevent就失效了
不走NtSendInput 自己去实现键盘鼠标
这样就算NtSendInput 被hook对我们也没什么作用了

消息栈中的消息可能来自两种
真实的按键消息
通过WindowsAPI发送消息
游戏会通过技术手段屏蔽掉WindowsAPI发送的消息,但是不会屏蔽掉玩家真实的按键消息

如果想模拟玩家的真实按键操作的话 则通过驱动直接控制按键以达到目的。


环境变量更新之后 如果不关闭VS2008每次调试GetEnvironmentVariable得到的环境变量依旧是旧的。
必须重启VS2008之后 调试时环境变量才会更新

修改系统环境变量
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
环境变量立即生效
DWORD dwResult;
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, (LPARAM)"Environment", SMTO_NOTIMEOUTIFNOTHUNG, INFINITE, &dwResult);

获取下拉框中某个项的位置
CComboBox::SelectString

FindFirstFile FindNextFile之后需要使用FindClose关闭句柄

VS以下文件中的行尾不一致,要将行尾标准化吗
解决方案:用记事本打开cpp 删除记事本不识别的字符

在#define中,标准只定义了#和##两种操作。#用来把参数转换成参数名字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。

按键的截屏 会直接进入内核发现热键的调用。直接调用BitBlt截屏
所以你SHADOW ssdt HOOK(表HOOK)没用的。他不用系统表调用,而是直接CALL inline HOOK才有用
按PrintScreen键以后 消息投递到处理列队,发现是printscreen,内核直接调用xxxsnapwindow 
由于是同一个模块,所以是直接调用的内核bitblt 没有从表里面获取地址。因此无效。
inline HOOK bitblt或者stretch是有效的
只有三环调用的才从表里面过。按键截屏 内核直接调用 都是自己的东西为还要脱裤子放屁 从表里面取地址。

VC6.0项目 -> VS2008 的时候
_WIN32_WINNT settings conflicts with _WIN32_IE setting冲突
解决方案:
如果遇到_WIN32_WINNT定义 将定义修改成
#if _MSC_VER <= 1200 // MFC 6.0 or earlier
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
#else
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#endif
如果遇到WINVER定义 将定义修改成
#if _MSC_VER <= 1200 // MFC 6.0 or earlier
#ifndef WINVER
#define WINVER 0x0400
#endif
#else
#ifndef WINVER
#define WINVER 0x0501
#endif
#endif

m_hWorkClientEvent = ::CreateEvent(NULL,false,true,"CWorkClientSocket");
【第二个参数】指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。
【第三个参数】指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。

InternetReadFile循环读取数据 直到读出来的长度为0 才表示读取结束

域名解析
CString strIP = "";
PHOSTENT pHostent = gethostbyname(strUrl); 
if (pHostent != NULL)
{
in_addr addr;
addr.s_addr = *(u_long *)pHostent->h_addr_list[0];
strIP = inet_ntoa(addr);
}
return strIP;

扫描端口
SOCKET fdSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(fdSock < 0) continue;

//以服务器地址填充结构serv_addr
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("192.168.0.40");
serv_addr.sin_port = htons(iPort[iTimes]);
int error = -1;
int len = sizeof(int);
timeval tm;
fd_set set;
unsigned long ul = 1;
ioctlsocket(fdSock, FIONBIO, &ul); //设置为非阻塞模式
bool ret = false;
if (connect(fdSock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
{
tm.tv_sec  = 0;
tm.tv_usec = 100*1000;
FD_ZERO(&set);
FD_SET(fdSock, &set);
if( select(fdSock + 1, NULL, &set, NULL, &tm) > 0)
{
getsockopt(fdSock, SOL_SOCKET, SO_ERROR, (char *)&error, /*(socklen_t *)*/&len);
ret = error == 0 ? true : false;

}

ul = 0;
ioctlsocket(fdSock, FIONBIO, &ul); //设置为阻塞模式
closesocket( fdSock );
fdSock = -1;

字符串日期转换成SYSTEMTIME
sscanf_s(strOrderTime, _T("%d-%d-%d"), &m_OrderTime.wYear, &m_OrderTime.wMonth, &m_OrderTime.wDay);

在c++中,typeid用于返回指针或引用所指对象的实际类型。

使用#pragma region和#pragma endregion关键字,来定义可以扩展和收缩的代码区域的开头和结尾。

__super Visual Studio 2005中新增了__super关键字,它代表本类的基类

clickable不能等于(0, 0) 否则可能点击失败
LPARAM lparam = MAKELPARAM(clickable.x, clickable.y)
::SendMessage(hwnd, WM_LBUTTONDOWN, 0, lparam);
::SendMessage(hwnd, WM_LBUTTONUP, 0, lparam)

interruption_point()则是一个特殊的中断点函数,它并不等待,只是起到一个标签的作用,表示线程执行到这个函数所在的语句就可以被中断

this_thread::yield();
yield和sleep都是在线程处于Running的时候开始的,yield只是让出分配给自己的CPU时间片,并且会立刻进入Runable状态参与CPU时间的竞争,若程序中没有其他线程,那么该线程马上就会开始往下执行;sleep会进入Blocked状态,等待时间结束事件的发生,然后进入Runable状态参与CPU时间的竞争

is_alnum 判断字符变量c是否为字母或数字,若是则返回非零,否则返回零。
isdigit 检查参数c是否为阿拉伯数字0到9。

vs2010上方 窗口->重置布局

::FatalAppExit(0, TEXT("CoInitializeEx"));
显示一个消息框,关闭消息框的时候终止程序

boost::filesystem::remove_all("C:\\ProgramData")移除所有文件

设置单例
#define SINGLETON_CLASS(className)\
public:\
    static className& Instance()\
    {\
        static className _Instance; \
        return _Instance;\
    }

ptr_fun将普通函数(两个参数, 如果有多个参数, 要改用boost::bind)适配成bind1st或bind2nd能够使用的functor,否则对bind1st或bind2nd直接绑定普通函数,则编译出错
void print(int i, int j){std::cout<<i<<endl<<j;};
for_each(ArrayTemp.begin(), ArrayTemp.end(), bind1st(ptr_fun(print), 666));

Notepad++软件格式XML文件
启动Notepad++,按图所示进行操作。
在”plugin Manager“中找到”XML Tools“插件,点击”Install“按钮。

sudo passwd root
su

查看局域网内所有IP :arp -a
查看局域网内所有主机名: net view 然后 ping -4 TYXX
查看IP地址对应的主机名和MAC地址: nbtstat -a 192.168.0.101

IHTMLElement click失效
有些页面并不是通过onclick提交的;
有些onclick提交的网页,js代码中做了一检查,比如 必须要先触发 onfocus / onblur 才能成功;

::CoInitializeEx(NULL, COINIT_MULTITHREADED);
多线程初始化会导致IHTMLDocument2接口返回失败E_NOINTERFACE

智能指针
std::shared_ptr<void> hProcess(GetWindowProcessHandle(_hWnd), [](HANDLE h) {
if (h) ::CloseHandle(h);
});
if(!hProcess) return false;

Windows 已在 WebBrowserShowName.exe 中触发一个断点。其原因可能是堆被损坏,这说明 WebBrowserShowName.exe 中或它所加载的任何 DLL 中有 Bug。
解决方案:打开项目属性-->配置属性-->常规-->项目默认值-->MFC的使用,选择“在共享 DLL 中使用 MFC”

IHTMLInputElement::put_value()只负责修改值 不改变源代码
IHTMLInputElement::put_defaultValue()可以修改源代码

SetForegroundWindow函数将创建指定的窗口,并激活到前台窗口的线程

MFC对话框下面使用new和delete时崩溃(DEBUG模式下崩溃 Release正常) 需要删除MFC中自动创建的以下代码
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

pugi::xml修改节点值
Node.first_child().set_value("1111");

PathRemoveFileSpec函数的作用是将路径末尾的文件名和反斜杠去掉
PathAppend将一个路径追加到另一个路径后面

关闭_CRT_SECURE_NO_WARNINGS警告
操作vs2010中,在项目->属性->C/C++->预处理器->预处理器定中添加 _CRT_SECURE_NO_WARNINGS 这个预定义。

mysql命令行安装之后 创建数据库并赋权
mysql -u root --password= -e"create database NewDatabase  default character set utf8 collate utf8_bin;grant all privileges on NewDatabase.* to AdminTest identified by '123456';"

从A库导出一张表 然后导入到B库
mysqldump -h 192.168.0.2 -u AdminTest --password=123456 OldDatabase > backup.sql
mysql -u AdminTest --password=654321 -e"use NewDatabase;source backup.sql;"
del backup.sql

bat判断服务是否存在
sc query |find /i "MySQL" >nul 2>nul  
if not errorlevel 1 (goto exist) else goto notexist  
:exist   REM 这里写服务存在时用的代码  
goto :end
:notexist   REM 这里写服务不存在时用的代码   
goto :end
:end  
pause 

1 0
原创粉丝点击