VC结束进程

VC结束第三方应用的进程:

BOOL GetDebugPriv()
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;

    if (!OpenProcessToken(GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY , &hToken))
    {
        return FALSE ;
    }

    if (! LookupPrivilegeValue( NULL , SE_DEBUG_NAME , &sedebugnameValue))
    {
        CloseHandle(hToken);
        return FALSE ;
    }

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ;

    if (!AdjustTokenPrivileges(hToken, FALSE , &tkp, sizeof tkp, NULL, NULL))
    {
        CloseHandle(hToken);
        return FALSE ;
    }

    return TRUE ;
}


void CToolDlg ::KillProcess()
{
                GetDebugPriv();

                 PROCESSENTRY32 pe32;
                pe32.dwSize = sizeof (pe32);
                 HANDLE hProcessSnap = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
                 if (hProcessSnap == INVALID_HANDLE_VALUE )
                {
                                 MessageBox (L"CreateToolhelp32Snapshot调用失败!\n" );
                                 return ;
                }

                 CString strPrcNameID;
                 BOOL bMore = ::Process32First (hProcessSnap, &pe32);
                 while (bMore)
                {
                                 if (lstrcmp (pe32.szExeFile, _TEXT( "contrlvip.exe")) == 0)
                                {
                                                 HANDLE hTargetProcess = OpenProcess(PROCESS_QUERY_INFORMATION |   // Required by Alpha
                                                                 PROCESS_CREATE_THREAD |   // For CreateRemoteThread
                                                                 PROCESS_VM_OPERATION |   // For VirtualAllocEx/VirtualFreeEx
                                                                 PROCESS_VM_WRITE |  // For WriteProcessMemory
                                                                 PROCESS_TERMINATE ,           //Required to terminate a process using TerminateProcess function
                                                                 FALSE , pe32.th32ProcessID);

                                                 if (hTargetProcess == NULL )
                                                {
                                                                 DWORD ulErrCode = GetLastError();
                                                                 CString strError;
                                                                strError.Format( L"OpenProcess failed,error code:%ld" , ulErrCode);
                                                                AfxMessageBox(strError);
                                                }

                                                 BOOL result = TerminateProcess(hTargetProcess, 0);
                                                 if (!result)
                                                {
                                                                 DWORD ulErrCode = GetLastError();
                                                                 CString strError;
                                                                strError.Format( L"TerminateProcess failed,error code:%ld" , ulErrCode);
                                                                AfxMessageBox(strError);
                                                }
                                }

                                bMore = :: Process32Next (hProcessSnap, &pe32);
                }
                ::CloseHandle(hProcessSnap);
}

VC获取程序所在的目录

VC获取程序所在的目录

CString  GetCurDir()
{
                 char   sDrive[_MAX_DRIVE ];
                 char   sDir[_MAX_DIR ];
                 char   sFilename[_MAX_FNAME ], Filename[_MAX_FNAME];
                 char   sExt[_MAX_EXT ];
                 GetModuleFileName(AfxGetInstanceHandle(), Filename, _MAX_PATH);
                 _tsplitpath(Filename, sDrive, sDir, sFilename, sExt);
                 CString   homeDir(CString (sDrive) + CString(sDir));
                 int   nLen = homeDir.GetLength();

                 if (homeDir.GetAt(nLen - 1)!= '\\' )
                {
                                homeDir += '\\' ;
                }

                 return homeDir;
}

VC++获取控制台命令的输出结果

VC++获取控制台命令的输出结果

#include "stdafx.h"

#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;

BOOL ExecDosCmd(string cmd, string &output)
{
    SECURITY_ATTRIBUTES sa;
    HANDLE hRead, hWrite;

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;
    if (!CreatePipe(&hRead, &hWrite, &sa, 0))
    {
        return FALSE;
    }
    char command[1024]; // 长达1K的命令行,够用了吧
    strcpy(command, "Cmd.exe /C ");
    strcat(command, cmd.c_str());
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    si.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&si);
    si.hStdError = hWrite;  // 把创建进程的标准错误输出重定向到管道输入
    si.hStdOutput = hWrite; // 把创建进程的标准输出重定向到管道输入
    si.wShowWindow = SW_HIDE;
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    // 关键步骤,CreateProcess函数参数意义请查阅MSDN
    if (!CreateProcess(NULL, command, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
    {
        CloseHandle(hWrite);
        CloseHandle(hRead);
        return FALSE;
    }
    CloseHandle(hWrite);

    char buffer[4096] = {0}; // 用4K的空间来存储输出的内容,只要不是显示文件内容,一般情况下是够用了。
    DWORD bytesRead;
    while (true)
    {
        if (ReadFile(hRead, buffer, 4095, &bytesRead, NULL) == NULL)
            break;
        // buffer中就是执行的结果,可以保存到文本,也可以直接输出
        // AfxMessageBox(buffer);   //这里是弹出对话框显示
        // cout << "----:" << endl << buffer << endl;
    }
    CloseHandle(hRead);

    output = buffer;
    return TRUE;
}

int main()
{
    string output;
    ExecDosCmd("wmic diskdrive get Caption,SerialNumber", output);
    cout << output << endl;
    return 0;
}

VC 递归调用GetWindow查找控件

VC 递归调用GetWindow查找控件

HWND g_TargetMainWnd = NULL ;
BOOL WINAPI   EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
        if (:: GetWindowLong(hWnd , GWL_STYLE ) & WS_VISIBLE )
       {
               char szWindowText[128] = { 0 };
               if (:: GetWindowText(hWnd , szWindowText, 128) != 0)
              {
                      if (strstr(szWindowText, "职业技能实训平台" ) != NULL )
                     {
                           g_TargetMainWnd = hWnd;
                            return FALSE;
                     }
              }

       }
        return TRUE;
}

void CAnswerGetDlg ::Work(HWND hSubWnd )
{
        if ( hSubWnd != NULL)
       {             
               while ( hSubWnd != NULL)
              {
                      char szWindowText[128] = { 0 };
                     :: GetWindowText(hSubWnd , szWindowText, 128);
                      if (strstr(szWindowText, "[A]"))
                     {
                            RECT rc;
                            BOOL bret = ::GetWindowRect( hSubWnd, &rc);                                 
                            SetDlgItemText(IDC_EDIT1 , szWindowText + 3);
                            char szCoordinate[16] = { 0 };
                           sprintf(szCoordinate, "%d %d", rc.left, rc.top);
                            SetDlgItemText(IDC_EDIT5 , szCoordinate);
                     }
                      if (strstr(szWindowText, "[B]"))
                     {
                            RECT rc;
                           ::GetWindowRect( hSubWnd, &rc);
                            SetDlgItemText(IDC_EDIT2 , szWindowText + 3);
                            char szCoordinate[16] = { 0 };
                           sprintf(szCoordinate, "%d %d", rc.left, rc.top);
                            SetDlgItemText(IDC_EDIT6 , szCoordinate);
                     }
                      if (strstr(szWindowText, "[C]"))
                     {
                            RECT rc;
                           ::GetWindowRect( hSubWnd, &rc);
                            SetDlgItemText(IDC_EDIT3 , szWindowText + 3);
                            char szCoordinate[16] = { 0 };
                           sprintf(szCoordinate, "%d %d", rc.left, rc.top);
                            SetDlgItemText(IDC_EDIT7 , szCoordinate);
                     }
                      if (strstr(szWindowText, "[D]"))
                     {
                            RECT rc;
                           ::GetWindowRect( hSubWnd, &rc);
                            SetDlgItemText(IDC_EDIT4 , szWindowText + 3);
                            char szCoordinate[16] = { 0 };
                           sprintf(szCoordinate, "%d %d", rc.left, rc.top);
                            SetDlgItemText(IDC_EDIT8 , szCoordinate);
                     }

                      HWND hSubWnd2 = ::GetWindow( hSubWnd, GW_CHILD);
                      if(hSubWnd2 != NULL)
                     {
                           Work(hSubWnd2);
                     }

                      hSubWnd = ::GetWindow( hSubWnd, GW_HWNDNEXT);
              }
       }
}


void CAnswerGetDlg ::OnBnClickedOk()
{
        for ( int i = 0; i < 8; i++)
       {
               SetDlgItemText(1000 + i, "" );
       }
       ::EnumWindows(( WNDENUMPROC)EnumWindowsProc, NULL );
        if (g_TargetMainWnd != NULL)
       {
               HWND hSubWnd = ::GetWindow(g_TargetMainWnd, GW_CHILD);
              Work(hSubWnd);
       }
}

VC 检测文件是否存在

VC 检测文件是否存在

bool IsExistFile(LPCSTR pszFileName )
{
        WIN32_FIND_DATA FindFileData;
        HANDLE hFind;

       hFind = FindFirstFile(pszFileName , &FindFileData);

        if (hFind == INVALID_HANDLE_VALUE)
               return false;
        else
       {
              FindClose(hFind);
               return true;
       }
        return false;
}

VC为RichTextBox添加右键菜单

VC为RichTextBox添加右键菜单

private void InitRichTextBoxContextMenu(RichTextBox textBox)
{
    //创建剪切子菜单
    var cutMenuItem = new MenuItem( "剪切");
    cutMenuItem.Click += (sender, eventArgs) => textBox.Cut();

    //创建复制子菜单
    var copyMenuItem = new MenuItem( "复制");
    copyMenuItem.Click += (sender, eventArgs) => textBox.Copy();

    //创建粘贴子菜单
    var pasteMenuItem = new MenuItem( "粘贴");
    pasteMenuItem.Click += (sender, eventArgs) => textBox.Paste();

    //创建右键菜单并将子菜单加入到右键菜单中
    var contextMenu = new ContextMenu();
    contextMenu.MenuItems.Add(cutMenuItem);
    contextMenu.MenuItems.Add(copyMenuItem);
    contextMenu.MenuItems.Add(pasteMenuItem);

    textBox.ContextMenu = contextMenu; //为richtextbox设置菜单
}

VC 获取跳转后的网址

VC 获取跳转后的网址

BOOL GetRedirectUrl(std::string strUrl , string &redirectUrl )
{

       
    //定义变量 
    HINTERNET hInet = NULL; //打开internet连接handle 
    HINTERNET hConnect = NULL; //HTTP连接 
    HINTERNET hRequestHead = NULL; //HTTP Request 
    HINTERNET hRequestGet = NULL; //HTTP Request 
    HANDLE hFileWrite = NULL; //写文件的句柄 
    char* pBuf = NULL; //缓冲区 
    DWORD dwRequestTryTimes = MAX_DOWNLOAD_REQUEST_TIME; //尝试请求的次数 
    DWORD dwDownBytes = 0; //每次下载的大小 
    DWORD dwDownFileTotalBytes = 0; //下载的文件总大小 
    DWORD dwWriteBytes = 0; //写入文件的大小 
    char bufQueryInfo[ LEN_OF_BUFFER_FOR_QUERYINFO] = {0}; //用来查询信息的buffer 
    DWORD dwBufQueryInfoSize = sizeof(bufQueryInfo); 
    DWORD dwStatusCode = 0; 
    DWORD dwContentLen = 0; 
    DWORD dwSizeDW = sizeof( DWORD); 
       
    //分割URL 
    CHAR pszHostName[ INTERNET_MAX_HOST_NAME_LENGTH] = {0}; 
    CHAR pszUserName[ INTERNET_MAX_USER_NAME_LENGTH] = {0}; 
    CHAR pszPassword[ INTERNET_MAX_PASSWORD_LENGTH] = {0}; 
    CHAR pszURLPath[ INTERNET_MAX_URL_LENGTH] = {0}; 
    CHAR szURL[INTERNET_MAX_URL_LENGTH] = {0}; 
    URL_COMPONENTSA urlComponents = {0}; 
    urlComponents.dwStructSize = sizeof( URL_COMPONENTSA); 
    urlComponents.lpszHostName = pszHostName; 
    urlComponents.dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH; 
    urlComponents.lpszUserName = pszUserName; 
    urlComponents.dwUserNameLength = INTERNET_MAX_USER_NAME_LENGTH; 
    urlComponents.lpszPassword = pszPassword; 
    urlComponents.dwPasswordLength = INTERNET_MAX_PASSWORD_LENGTH; 
    urlComponents.lpszUrlPath = pszURLPath; 
    urlComponents.dwUrlPathLength = INTERNET_MAX_URL_LENGTH; 
       
    BOOL bRet = InternetCrackUrlA( strUrl.c_str(), 0, NULL, &urlComponents); 
    bRet = (bRet && urlComponents.nScheme == INTERNET_SERVICE_HTTP); 
    if (!bRet) 
    { 
        goto _END_OF_DOWNLOADURL; 
    } 
       
    //打开一个internet连接 
    hInet = InternetOpenA( DOWNHELPER_AGENTNAME, INTERNET_OPEN_TYPE_PRECONFIG , NULL, NULL , NULL ); 
    if (!hInet) 
    { 
        bRet = FALSE; 
        goto _END_OF_DOWNLOADURL; 
    } 
       
    //打开HTTP连接 
    hConnect = InternetConnectA(hInet, pszHostName, urlComponents.nPort, pszUserName, pszPassword, INTERNET_SERVICE_HTTP , 0, NULL ); 
    if (!hConnect) 
    { 
        bRet = FALSE; 
        goto _END_OF_DOWNLOADURL; 
    } 
       
    //创建HTTP request句柄 
    if (urlComponents.dwUrlPathLength !=  0) 
        strcpy(szURL, urlComponents.lpszUrlPath); 
    else 
        strcpy(szURL, "/"); 
       
    //请求HEAD,通过HEAD获得文件大小及类型进行校验 
    hRequestHead = HttpOpenRequestA(hConnect, "HEAD", szURL, "HTTP/1.1" , "" , NULL , INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_AUTO_REDIRECT , 0); 


    bRet = FALSE; 
     dwStatusCode = 0; 
     dwSizeDW = sizeof(DWORD); 
 
        //发送请求 
        bRet = HttpSendRequestA(hRequestHead, NULL, 0, NULL, 0); 
        if (!bRet) 
        { 
                     bRet = FALSE;
                      goto _END_OF_DOWNLOADURL;
   
        } 
        else 
        { 
            //判断HTTP返回的状态码 
            dwStatusCode = 0; 
            dwSizeDW = sizeof( DWORD); 
            bRet = HttpQueryInfo(hRequestHead, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE, &dwStatusCode, &dwSizeDW, NULL ); 
            if (bRet) 
            { 
                //检查状态码 
                if ( HTTP_STATUS_OK == dwStatusCode) //200 OK 
                { 
                                  bRet = FALSE;
                                   goto _END_OF_DOWNLOADURL;
                   
                } 
                            else if (302 == dwStatusCode)
                           {
                                   //GetStatusCode(hRequest);
                                   TCHAR szBuffer[ INTERNET_MAX_URL_LENGTH] = {0};
                                   DWORD dwLen = sizeof(szBuffer);
                                  
                                   // 获取HTTP请求信息(HTTP_QUERY_LOCATION获取的绝对URL在Location应答头)
                                   BOOL bRet = HttpQueryInfo(hRequestHead, HTTP_QUERY_LOCATION, szBuffer, &dwLen, NULL );
                                  
                                   redirectUrl = szBuffer;
                                   goto _END_OF_DOWNLOADURL;
                                  bRet = TRUE;
                           }
                else 
                { 
                    bRet = FALSE;  
                } 
            } 
        }

               //清理 
_END_OF_DOWNLOADURL: 
               if ( INVALID_HANDLE_VALUE != hFileWrite) 
                     CloseHandle(hFileWrite); 
               if (pBuf) 
                      delete [] pBuf; 
               if (hRequestGet) 
                     InternetCloseHandle(hRequestGet); 
               if (hRequestHead) 
                     InternetCloseHandle(hRequestHead); 
               if (hConnect) 
                     InternetCloseHandle(hConnect); 
               if (hInet) 
        InternetCloseHandle(hInet); 

               return bRet;
     
}