1. 程式人生 > >windows 下隱藏 system 函數彈窗

windows 下隱藏 system 函數彈窗

hwnd log main hat wchar lose byte ces sys

概述

下面的程序是解決windows 下面調用 system() 函數的時候,會有窗口彈出的問題

頭文件

#include <windows.h>

源碼

/**
* @brief 普通字符轉寬字符
*
* @param lpcszStr 普通字符
* @param lpwszStr 轉換後的寬字符
* @param dwSize 存儲寬字符的緩沖區大小
*
* @return 
*/
BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
{
// Get the required size of the buffer that receives the Unicode 
// string. DWORD dwMinSize; dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0); if(dwSize < dwMinSize) { return FALSE; } // Convert headers from ASCII to Unicode. MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize); return TRUE; }
/**
* @brief 寬字符轉普通字符
*
* @param lpcwszStr 寬字符
* @param lpszStr 轉換後的普通字符
* @param dwSize 存儲普通字符的緩沖區大小
*
* @return 
*/ BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize) { DWORD dwMinSize; dwMinSize = WideCharToMultiByte(CP_OEMCP,0,lpcwszStr,-1,NULL,0,NULL,FALSE); if(dwSize < dwMinSize) { return FALSE; } WideCharToMultiByte(CP_OEMCP,0,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE); return TRUE; }
/**
* @brief 
* WinExec 和 ShellExecute 兩個函數在執行的時候不會等待命令執行完成,
* 會造成文件沒有解壓完就執行完了,不符合我們的需求
* ret=WinExec(cmd,SW_HIDE);
* ShellExecute((HWND)"open", LPCWSTR(cmd), NULL, NULL,NULL,SW_HIDE); 
*
* system 函數調用可以,但是會有窗口彈出
* ret = system(cmd);
*
* 采用下面的方式
*
* @param cmd 這裏面不能出現 > 符號
*
* @return 
* 
*/ int nb_system (char *cmd) { wchar_t cmd_w[2048] = {0}; MByteToWChar(cmd, cmd_w, sizeof(cmd_w)/sizeof(cmd_w[0])); STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof STARTUPINFO; PROCESS_INFORMATION pi={0}; if(CreateProcess(NULL,cmd_w,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,NULL,NULL,&si,&pi)) { //等待進程執行完畢 WaitForSingleObject(pi.hProcess ,INFINITE); //釋放資源 CloseHandle(pi.hProcess ); CloseHandle(pi.hThread ); } else { //運行失敗 return -1; } return 0; }

測試

int main()

{
   nb_system("dir");
}

windows 下隱藏 system 函數彈窗