常用的小函数

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);

只是该函数必须是静态的,要想不是静态的,不行,因为方法是在类里的,耐用实例确包含着数据,这样,知道方法的地址,确没有数据是不行的。   但我觉得,只要是了解了内部类的构造情况,应该可以加多一个参数,即实例的地址,或许可以传入某实例的方法进来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值