1获取命令行的第N个参数值
CString getString(CString strOpt,int n,CString sign=_T("")) //传入字符串 N 以什么做为分格符
{
int nSign=0;
CString result=_T("");
for(int i=0;i<strOpt.GetLength();i++)
{
if(strOpt.GetAt(i)==sign)
{
if(n-1==nSign)
{
return result;
}
else
{
nSign++;
result=_T("");
}
}
else
{
result+=strOpt.GetAt(i);
}
}
if(n-1==nSign)
return result;
else
return _T("");
}
2 模拟键盘按键
keybd_event(VK_DELETE,MapVirtualKey(VK_DELETE,0),0,0); 按下
keybd_event(VK_DELETE,MapVirtualKey(VK_DELETE,0),KEYEVENTF_KEYUP,0); 释放
3 模拟控件的事件
比如下面要模拟单击按钮
PostMessage(WM_COMMAND[按钮是命令消息类型], MAKEWPARAM(IDC_BUTTON2[按钮ID, BN_CLICKED[按钮消息类型]), LPARAM(fthis->GetDlgItem(IDC_BUTTON2)->GetSafeHwnd()));
4 新建子进程
STARTUPINFO update_si;
PROCESS_INFORMATION update_pi;
update_si.wShowWindow=SW_HIDE;
ZeroMemory( &update_si, sizeof(update_si) );
update_si.cb = sizeof(update_si);
ZeroMemory( &update_pi, sizeof(update_pi) );
CreateProcess( _T("文件名 *.exe"),
NULL, // Command line. //命令行参数
NULL, //NULL Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
CREATE_SUSPENDED,//CREATE_NO_WINDOW, // 新建标识
NULL, // Use parent's environment block.
_T("D://KOF//"), // 新建后的进程默认当前路径
&update_si, // Pointer to STARTUPINFO structure.
&update_pi) // Pointer to PROCESS_INFORMATION structure.
)
5 隐藏特定名字的窗口
BOOL CMFC_FormDlg::HideWindows(CString wName)
{
//隐藏窗口
HWND hwnd,hwnd1;
CWnd *hw,*hw1;
int i=0;
hw = FindWindowEx(NULL,NULL,_T("#32770"),NULL);
CString str=_T("");
hwnd=hw->GetSafeHwnd();
while(hwnd != NULL)
{
hw1 = FindWindowEx(hwnd,NULL,_T("#32770"),NULL);
hw->GetWindowTextW(str);
if(str==wName)
{
hw->ShowWindow(SW_HIDE);
i=1;
str.Format(_T("%d"),hwnd);
UpdateData(FALSE);
break;
}
hw=hw->GetWindow(GW_HWNDNEXT);
hwnd=hw->GetSafeHwnd();
}
return i==1;
}
6 显示模块信息 以下是枚举特定进程的所有模块
BOOL CMFC_FormDlg::FindModuleName(DWORD PID,CString moduleName)//进程ID,模块名
{
HANDLE hModuleSnap = NULL;
MODULEENTRY32 pe32 = {0};
BOOL isOut=TRUE;
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);
if (hModuleSnap == (HANDLE)-1)
return (FALSE);
pe32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hModuleSnap, &pe32))
{
while(isOut)
{
str.Format(_T("%s"),pe32.szExePath);
if(str.Left(14)==moduleName)
{
}
isOut=Module32Next(hModuleSnap, &pe32);
}
}
return(TRUE);
}
7 通过窗口句柄得到所属进程
DWORD pid; GetWindowThreadProcessId(::GetActiveWindow(), &pid );
8 卸载注入的东西
HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, NULL );
// 等待GetModuleHandle运行完毕
WaitForSingleObject( hThread, INFINITE );
// 获得GetModuleHandle的返回值
GetExitCodeThread( hThread, &dwHandle );
// 释放目标进程中申请的空间
VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );
CloseHandle( hThread );
9 CString 转Char
char * CStringToChar(LPWSTR csStr/*CString csStr*/)
{
ZeroMemory(BUFFER,BUFFERSIZE);
char *pCStr=(char*)csStr;
int len=wcslen(csStr);
for(int i=0;i<len*2;i+=2)
{
BUFFER[(i+1)/2]=pCStr[i];
}
BUFFER[wcslen(csStr)]='/0';
return BUFFER;
}
10判断线程是否退出
DWORD ExitCode=NULL;
GetExitCodeThread((HANDLE)mynewthread[gThreadIndex]->Handle,&ExitCode);
ExitCode==STILL_ACTIVE 退出代码
11 wcstombs_user 用户版
PBYTE wcstombs_user(PWCHAR pCS,INT Length)
{
BYTE *buff=new BYTE[Length+1],*pMs;
BYTE bb;
for (int i=0;i<Length;i++)
{
pMs=(PBYTE) pCS;
pCS++;
buff[i]=*pMs;
}
buff[Length]='/0';
return buff;
}
12 把指向类成员函数的做为参数
1 如类有class a{public:
static void print()
{ printf("out"); }
}
2 有一函数 void CallFn(int i,NOTIFYEVENT notifyEvent) typedef void(*NOTIFYEVENT)();
{notifyEvent();} //调用
3 a A1; typedef void(a::*NOTIFY)(); NOTIFY ppfn=&a::print; CallFn(1,(NOTIFYEVENT)&ppfn);
只是该函数必须是静态的,要想不是静态的,不行,因为方法是在类里的,耐用实例确包含着数据,这样,知道方法的地址,确没有数据是不行的。 但我觉得,只要是了解了内部类的构造情况,应该可以加多一个参数,即实例的地址,或许可以传入某实例的方法进来