亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? shellview.cpp

?? 一個關于shell的開發應用介紹.內容全面
?? CPP
字號:
// ShellView.cpp : implementation of the CShellView class
//

#include "stdafx.h"
#include "Shell.h"

#include "ShellDoc.h"
#include "ShellView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CShellView

IMPLEMENT_DYNCREATE(CShellView, CEditView)

BEGIN_MESSAGE_MAP(CShellView, CEditView)
	//{{AFX_MSG_MAP(CShellView)
	ON_WM_CHAR()
	ON_WM_KEYDOWN()
	ON_WM_DESTROY()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CShellView construction/destruction

CShellView::CShellView()
{
	dwProcessId = DWORD(-1);
	m_pReadThread = NULL;

	//	Initialize LOGFONT structure
	memset(&m_lf, 0, sizeof(m_lf));
	m_lf.lfWeight = FW_NORMAL;
	m_lf.lfCharSet = GB2312_CHARSET;//ANSI_CHARSET;
	m_lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
	m_lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	m_lf.lfQuality = DEFAULT_QUALITY;
	m_lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
	lstrcpy(m_lf.lfFaceName, _T("FixedSys"));
}

CShellView::~CShellView()
{
}

BOOL CShellView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	BOOL bPreCreated = CEditView::PreCreateWindow(cs);
	cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);	// Enable word-wrapping

	return bPreCreated;
}

/////////////////////////////////////////////////////////////////////////////
// CShellView drawing

void CShellView::OnDraw(CDC* pDC)
{
	CShellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CShellView printing

BOOL CShellView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default CEditView preparation
	return CEditView::OnPreparePrinting(pInfo);
}

void CShellView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView begin printing.
	CEditView::OnBeginPrinting(pDC, pInfo);
}

void CShellView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView end printing
	CEditView::OnEndPrinting(pDC, pInfo);
}

/////////////////////////////////////////////////////////////////////////////
// CShellView diagnostics

#ifdef _DEBUG
void CShellView::AssertValid() const
{
	CEditView::AssertValid();
}

void CShellView::Dump(CDumpContext& dc) const
{
	CEditView::Dump(dc);
}

CShellDoc* CShellView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CShellDoc)));
	return (CShellDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CShellView message handlers

void CShellView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	int nPos = GetCurrentPosition();
	if( nChar==8 && nPos<=m_nLength )
		return;
	if( nPos<m_nLength )
		MoveToEnd();
	CEditView::OnChar(nChar, nRepCnt, nFlags);
	if( nChar==13 )
	{
		CString input;
		GetUserInput(input);
		WriteToPipe( input );
	}
}

void CShellView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if( nChar==VK_DELETE )
	{
		if( GetCurrentPosition()<m_nLength )
			return;
	}
	CEditView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CShellView::OnDestroy() 
{
	CEditView::OnDestroy();
	
	// TODO: Add your message handler code here
	
}

int CShellView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CEditView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
//	GetEditCtrl().SetReadOnly( TRUE );
	DWORD dwStyle = GetWindowLong( GetEditCtrl().GetSafeHwnd(),GWL_STYLE );
	if( dwStyle )
	{
		dwStyle |= DS_LOCALEDIT;
		SetWindowLong( GetEditCtrl().GetSafeHwnd(),GWL_STYLE,dwStyle );
	}

	if( m_defFont.CreateFontIndirect( &m_lf ) )
		GetEditCtrl().SetFont( &m_defFont );
	if( !CreateShellRedirect() )
		return -1;

	return 0;
}


#define BUFSIZE 4096

BOOL CShellView::CreateShellRedirect()
{
	SECURITY_ATTRIBUTES saAttr;
	BOOL fSuccess;

	// Set the bInheritHandle flag so pipe handles are inherited.
	saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
	saAttr.bInheritHandle = TRUE;
	saAttr.lpSecurityDescriptor = NULL;

	// The steps for redirecting child process's STDOUT: 
	//     1. Save current STDOUT, to be restored later. 
	//     2. Create anonymous pipe to be STDOUT for child process. 
	//     3. Set STDOUT of the parent process to be write handle to 
	//        the pipe, so it is inherited by the child process. 
	//     4. Create a noninheritable duplicate of the read handle and
	//        close the inheritable read handle.  
	
	// Save the handle to the current STDOUT.  
	hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);  
	
	// Create a pipe for the child process's STDOUT.  
	if( !CreatePipe( &hChildStdoutRd, &hChildStdoutWr, &saAttr, 0) )
	{
		TRACE0( _T("Stdout pipe creation failed\n") );
		return FALSE;
	}

	// Set a write handle to the pipe to be STDOUT.  
	if( !SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr) )
	{
		TRACE0( _T("Redirecting STDOUT failed\n") );
		return FALSE;
	}
   
	// Create noninheritable read handle and close the inheritable read handle. 
    fSuccess = DuplicateHandle( GetCurrentProcess(), hChildStdoutRd,
        GetCurrentProcess(),  &hChildStdoutRdDup , 
		0,  FALSE,
        DUPLICATE_SAME_ACCESS );
	if( !fSuccess )
	{
		TRACE0( _T("DuplicateHandle failed\n") );
        return FALSE;
	}
	CloseHandle( hChildStdoutRd );
	
	// The steps for redirecting child process's STDIN: 
	//     1.  Save current STDIN, to be restored later. 
	//     2.  Create anonymous pipe to be STDIN for child process. 
	//     3.  Set STDIN of the parent to be the read handle to the 
	//         pipe, so it is inherited by the child process. 
	//     4.  Create a noninheritable duplicate of the write handle, 
	//         and close the inheritable write handle.  

	// Save the handle to the current STDIN. 
	hSaveStdin = GetStdHandle(STD_INPUT_HANDLE);  

	// Create a pipe for the child process's STDIN.  
	if( !CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0) )
	{
		TRACE0( _T("Stdin pipe creation failed\n") );
		return FALSE;
	}
	// Set a read handle to the pipe to be STDIN.  
	if( !SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd) ) 
	{
		TRACE0( _T("Redirecting Stdin failed\n") );
		return FALSE;
	}
	// Duplicate the write handle to the pipe so it is not inherited.  
	fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr, 
		GetCurrentProcess(), &hChildStdinWrDup, 
		0, FALSE,                  // not inherited       
		DUPLICATE_SAME_ACCESS ); 
	if( !fSuccess ) 
	{
		TRACE0( _T("DuplicateHandle failed\n") );
		return FALSE;
	}
	CloseHandle(hChildStdinWr);  
	
	// Now create the child process. 
	if( !CreateChildProcess(dwProcessId) )
	{
		TRACE0( _T("CreateChildProcess failed\n") );
		return FALSE;
	}
	// After process creation, restore the saved STDIN and STDOUT.  
	if( !SetStdHandle(STD_INPUT_HANDLE, hSaveStdin) )
	{
		TRACE0( _T("Re-redirecting Stdin failed\n") );
		return FALSE;
	}
	if( !SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout) )
	{
		TRACE0( _T("Re-redirecting Stdout failed\n") );
		return FALSE;
	}
	m_pReadThread = AfxBeginThread( (AFX_THREADPROC)ReadPipeThreadProc,(LPVOID)this );
	if( !m_pReadThread )
	{
		TRACE0( _T("Cannot start read-redirect thread!\n") );
		return FALSE;
	}
	return TRUE;
}


BOOL CShellView::CreateChildProcess(DWORD& dwProcessId)
{
	PROCESS_INFORMATION piProcInfo;
	STARTUPINFO siStartInfo;  

	// Set up members of STARTUPINFO structure.  
	ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
	siStartInfo.cb = sizeof(STARTUPINFO);  
	
	siStartInfo.dwFlags = STARTF_USESTDHANDLES;
	siStartInfo.hStdInput = hChildStdinRd;
	siStartInfo.hStdOutput = hChildStdoutWr;
	siStartInfo.hStdError = hChildStdoutWr;

	TCHAR shellCmd[_MAX_PATH];
	if( !GetEnvironmentVariable(_T("ComSpec"), shellCmd, _MAX_PATH) )
		  return FALSE;
#ifdef _UNICODE
	_tcscat( shellCmd, _T(" /U") );
#else	
	_tcscat( shellCmd, _T(" /A") );
#endif
	// Create the child process.  
	BOOL ret = CreateProcess( NULL,
			shellCmd,       // applicatin name
			NULL,          // process security attributes 
			NULL,          // primary thread security attributes 
			TRUE,          // handles are inherited 
			DETACHED_PROCESS, // creation flags 
			NULL,          // use parent's environment 
			NULL,          // use parent's current directory 
			&siStartInfo,  // STARTUPINFO pointer 
			&piProcInfo);  // receives PROCESS_INFORMATION 
	if( ret )
		dwProcessId = piProcInfo.dwProcessId;
	return ret;
}

void CShellView::WriteToPipe( LPCTSTR line )
{
	DWORD dwWritten;

	WriteFile( hChildStdinWrDup, line, _tcslen(line)*sizeof(TCHAR), 
			&dwWritten, NULL );
}

UINT CShellView::ReadPipeThreadProc( LPVOID pParam )
{
	DWORD dwRead;
	TCHAR chBuf[BUFSIZE]; 
	CShellView* pView = (CShellView*)pParam;

	TRACE0( _T("ReadPipe Thread begin run\n") );
	for( ;; )    
	{ 
		if( !ReadFile( pView->hChildStdoutRdDup, chBuf, 
			BUFSIZE, &dwRead, NULL) || dwRead == 0) 
			break; 
		chBuf[dwRead/sizeof(TCHAR)] = _T('\0');
		pView->AddTexts( chBuf );
		pView->m_nLength = pView->GetEditCtrl().SendMessage( WM_GETTEXTLENGTH );
	} 
	CloseHandle( pView ->hChildStdinRd);
	CloseHandle( pView ->hChildStdoutWr);
	CloseHandle( pView ->hChildStdinWrDup );
	CloseHandle( pView ->hChildStdoutRdDup );
	pView->m_pReadThread = NULL;
	pView->dwProcessId = DWORD(-1);
	pView->PostMessage( WM_CLOSE );
	return 1;
}


void CShellView::AddTexts(LPCTSTR string)
{
	MoveToEnd();
	GetEditCtrl().ReplaceSel( string );
}

void CShellView::AddTexts(TCHAR ch)
{
	TCHAR string[2];
	string[0] = ch;
	string[1] = _T('\0');
	AddTexts( (LPCTSTR)string );
}
void CShellView::MoveToEnd()
{
	int nLen = GetEditCtrl().SendMessage( WM_GETTEXTLENGTH );
	GetEditCtrl().SetSel( nLen,nLen );
}

int CShellView::GetCurrentPosition()
{
	GetEditCtrl().SetSel(-1,-1);
	int nstart,nstop;
	GetEditCtrl().GetSel(nstart,nstop);
	return nstart;
}
void CShellView::GetUserInput(CString &input)
{
	int where = GetCurrentPosition();
	HLOCAL hBuffer = GetEditCtrl().GetHandle();
	if( hBuffer )
	{
		LPCTSTR szBuffer = (LPCTSTR)LocalLock(hBuffer);
		if( szBuffer )
		{
			input = CString( szBuffer+m_nLength,(where-m_nLength) );
			LocalUnlock( hBuffer );
		}
	}
}
int CShellView::GetSelLength()
{
	int nstart,nstop;
	GetEditCtrl().GetSel(nstart,nstop);
	return (nstart-nstop);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲视频资源在线| 国产农村妇女精品| 亚洲国产精品自拍| 4438亚洲最大| 激情文学综合网| 国产欧美一区二区精品仙草咪| 国内成+人亚洲+欧美+综合在线| 精品国产百合女同互慰| 国产ts人妖一区二区| 亚洲图片另类小说| 欧美猛男超大videosgay| 青青草一区二区三区| 国产三级精品视频| 欧美视频一区二| 经典三级在线一区| 亚洲欧美色一区| 在线综合视频播放| 福利一区二区在线观看| 一区二区三区加勒比av| 日韩一区二区三区免费看 | 综合婷婷亚洲小说| 欧美午夜精品免费| 国产在线精品免费| 亚洲免费在线播放| 日韩免费在线观看| 色成年激情久久综合| 蜜桃一区二区三区在线观看| 国产欧美一区二区三区在线看蜜臀| 色婷婷狠狠综合| 国产综合色在线| 一区二区三区中文字幕精品精品| 日韩你懂的在线播放| 91精品91久久久中77777| 青青草97国产精品免费观看无弹窗版| 国产精品午夜免费| 精品理论电影在线观看 | 成人h动漫精品一区二区| 亚洲gay无套男同| 中文字幕在线观看不卡视频| 欧美一级夜夜爽| 一本久道久久综合中文字幕 | 国产在线精品国自产拍免费| 夜夜嗨av一区二区三区网页| 国产日本亚洲高清| 日韩亚洲欧美一区二区三区| 色综合色综合色综合色综合色综合| 久久国产剧场电影| 水蜜桃久久夜色精品一区的特点| 国产精品女人毛片| 国产午夜精品一区二区三区四区| 欧美精品欧美精品系列| 97se亚洲国产综合自在线不卡| 男人的天堂久久精品| 亚洲一区二区在线观看视频| 国产一区二区福利视频| 日日夜夜一区二区| 亚洲综合在线五月| 亚洲日本在线天堂| 国产精品理论在线观看| 久久综合999| 精品动漫一区二区三区在线观看| 3751色影院一区二区三区| 色噜噜狠狠成人中文综合| 成人免费看视频| 成人黄色一级视频| 国产成人福利片| 国产寡妇亲子伦一区二区| 麻豆久久久久久久| 日本视频一区二区| 蜜桃av噜噜一区| 美女网站色91| 精品影视av免费| 国内精品写真在线观看| 久草中文综合在线| 国内一区二区在线| 丰满岳乱妇一区二区三区| 国产99精品国产| 成人av网在线| 色成年激情久久综合| 日本福利一区二区| 欧美三级视频在线| 欧美久久一二区| 日韩精品专区在线| 久久婷婷综合激情| 国产精品天天摸av网| 中文字幕日本不卡| 夜夜精品视频一区二区| 亚洲成年人网站在线观看| 亚洲第一激情av| 免费欧美高清视频| 国精产品一区一区三区mba桃花| 精品午夜久久福利影院| 国产成人免费av在线| 成人污视频在线观看| 97久久人人超碰| 欧美日韩成人一区| 久久综合五月天婷婷伊人| 国产亚洲女人久久久久毛片| 中文字幕va一区二区三区| 亚洲欧美视频在线观看视频| 色婷婷av一区二区三区大白胸 | 欧美日本在线看| 精品福利av导航| 亚洲欧洲日韩在线| 午夜激情一区二区三区| 国产一区二区三区久久久| www.av亚洲| 日韩一区二区精品葵司在线| 国产蜜臀97一区二区三区| 亚洲综合精品久久| 激情综合亚洲精品| 色综合久久中文综合久久牛| 日韩一区二区精品葵司在线| 中文字幕高清一区| 日韩和欧美一区二区三区| 国产成人超碰人人澡人人澡| 日本精品视频一区二区三区| 欧美电影精品一区二区| 亚洲色欲色欲www在线观看| 麻豆高清免费国产一区| 91免费版在线| 欧美变态口味重另类| 亚洲欧美福利一区二区| 日本伊人午夜精品| 91香蕉视频黄| 精品国产乱码久久久久久久久| 亚洲图片另类小说| 国产精品羞羞答答xxdd| 精品视频资源站| 国产精品蜜臀av| 国产尤物一区二区在线| 欧美日韩亚洲高清一区二区| 欧美激情资源网| 久久国产精品99精品国产 | 全国精品久久少妇| 久久久综合网站| 日韩成人一区二区三区在线观看| 99国产精品国产精品毛片| 亚洲精品一区二区三区影院| 亚洲高清久久久| 色综合久久66| 国产午夜精品久久| 激情都市一区二区| 91精品国产综合久久久蜜臀粉嫩| 一区二区三区精品视频| av不卡免费电影| 亚洲国产精品高清| 粉嫩av一区二区三区粉嫩| 日韩免费性生活视频播放| 天天影视色香欲综合网老头| 色8久久人人97超碰香蕉987| 国产精品色一区二区三区| 国产一区二区三区免费播放| 日韩视频免费观看高清完整版 | 国产伦精品一区二区三区在线观看| 欧美日韩在线不卡| 一区二区在线观看av| 99视频一区二区| 国产精品午夜在线观看| 成人免费毛片高清视频| 国产精品少妇自拍| 成人午夜精品在线| 国产精品麻豆一区二区| jvid福利写真一区二区三区| 国产精品乱码久久久久久| 国产99久久久精品| 国产精品色眯眯| 99精品视频免费在线观看| 成人欧美一区二区三区黑人麻豆 | 久久99国产精品久久99果冻传媒| 亚洲综合一二区| 欧美日韩另类一区| 亚洲成人动漫av| 日韩三级伦理片妻子的秘密按摩| 麻豆成人久久精品二区三区红 | 2020国产精品| 国产成人日日夜夜| √…a在线天堂一区| 91在线观看成人| 亚洲成人免费视频| 日韩精品一区二区三区四区| 精品一区二区国语对白| 久久九九久精品国产免费直播| 成人性生交大片免费看中文| 亚洲男人天堂av网| 欧美日韩视频在线观看一区二区三区 | 亚洲一区在线观看视频| 欧美日韩国产色站一区二区三区| 青青青爽久久午夜综合久久午夜| 欧美大片在线观看一区二区| 国产一区二区按摩在线观看| 中文字幕在线不卡| 欧美浪妇xxxx高跟鞋交| 狠狠色狠狠色综合| 亚洲人成伊人成综合网小说| 在线不卡一区二区| 国产suv精品一区二区883| 一区二区在线观看av| 欧美成人一区二区三区在线观看 | 亚洲精品乱码久久久久久|