青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++之竹

無(wú)論是太陽(yáng)下,還是風(fēng)雨中,都要成長(zhǎng)!

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

Windows 控制臺(tái)程序的事件捕獲

      此篇內(nèi)容屬C++控制臺(tái)編程的一點(diǎn)基礎(chǔ)應(yīng)用,所以嘛,偶就偷個(gè)懶,不再做文字的講解,直接代碼。

      哦,對(duì)了!代碼之前,先就代碼的組成作個(gè)簡(jiǎn)單說(shuō)明。代碼的內(nèi)容共分為三塊:

    1. 以宏RUN_ATEXIT_SAMPLE標(biāo)識(shí)的atexit調(diào)用樣例
    2. 以宏RUN_SETCONSOLECTRLHANDLER_SAMPLE標(biāo)識(shí)的SetConsoleCtrlHandler調(diào)用樣例
    3. 以宏RUN_READCONSOLEINPUT_SAMPLE標(biāo)識(shí)的ReadConsoleInput調(diào)用樣例

      其中,第3段樣例代碼來(lái)自于MSDN:http://msdn.microsoft.com/en-us/library/ms685035(v=VS.85).aspx

      OK,開(kāi)始代碼!!

#include <windows.h>
#include 
<iostream>
#include 
<string>

using namespace std;

#define RUN_ATEXIT_SAMPLE
#define RUN_SETCONSOLECTRLHANDLER_SAMPLE
#define RUN_READCONSOLEINPUT_SAMPLE

#define SECOND(n) (n * 1000)

// ATEXIT_SAMPLE
void Run_atexit_Sample(void);

// SETCONSOLECTRLHANDLER_SAMPLE
BOOL WINAPI ConsoleHandler(__in DWORD dwCtrlType);

// READCONSOLEINPUT_SAMPLE
HANDLE hStdin; 
DWORD fdwSaveOldMode;
VOID ErrorExit(LPSTR);
VOID KeyEventProc(KEY_EVENT_RECORD); 
VOID MouseEventProc(MOUSE_EVENT_RECORD); 
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD); 
VOID Run_ReadConsoleInput_Sample(VOID);


int main(void)
{
#ifdef RUN_ATEXIT_SAMPLE
    Run_atexit_Sample();
#endif

#ifdef RUN_SETCONSOLECTRLHANDLER_SAMPLE
    cout 
<< "[RUN_SETCONSOLECTRLHANDLER_SAMPLE] START" << endl;
    cout 
<< "\t (Note: You just have 15sec to do the operations.)" << endl;
    
// 【SetConsoleCtrlHandler(HandlerRoutine, Add)】:
    
// Add == TRUE: 處理HandlerRoutine 被添加
    
//    如果 HandlerRoutine == NULL,則忽略對(duì) CTRL+C 輸入處理
    
// Add == FALSE: 處理HandlerRoutine 被移除
    
//    如果 HandlerRoutine == NULL,則恢復(fù)對(duì) CTRL+C 輸入的處理
    
// 對(duì) CTRL+C 輸入處理的忽略與恢復(fù),將被子進(jìn)程所繼承
    if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleHandler, TRUE) == FALSE) {
        DWORD dwErr 
= GetLastError();
        cout 
<< "[RUN_SETCONSOLECTRLHANDLER_SAMPLE] Failed to SetConsoleCtrlHandler! Err: " << dwErr << endl;
        
return (int)dwErr;
    }


    Sleep(SECOND(
15));
    cout 
<< "[RUN_SETCONSOLECTRLHANDLER_SAMPLE] END" << endl;
#endif

#ifdef RUN_READCONSOLEINPUT_SAMPLE
    cout 
<< "[RUN_READCONSOLEINPUT_SAMPLE] Enter Run_ReadConsoleInput_Sample()" << endl;
    Run_ReadConsoleInput_Sample();
    cout 
<< "[RUN_READCONSOLEINPUT_SAMPLE] Leave Run_ReadConsoleInput_Sample()" << endl;
#endif

    system(
"pause");
    
return 0;
}


//////////////////////////////////////////////////////////////////////////

void ExitProc_1(void
{
    cout 
<< "[RUN_ATEXIT_SAMPLE] This is ExitProc_1" << endl;
}


void ExitProc_2(void
{
    cout 
<< "[RUN_ATEXIT_SAMPLE] This is ExitProc_2" << endl;
}


// 【注意】:
// 1. atexit() 成功時(shí)返回 0
// 2. atexit() 的參數(shù)類(lèi)型為 void (__cdecl *func )( void )
// 3. atexit() 是將所傳入的回調(diào)函數(shù)放入棧中,故回調(diào)函數(shù)的執(zhí)行順序與atexit的順序相反
// 4. atexit() 只有當(dāng)應(yīng)用程序正常結(jié)束時(shí),回調(diào)函數(shù)才能執(zhí)行
// 5. atexit() 回調(diào)函數(shù)不能依賴(lài)于任何DLL,因?yàn)樵诨卣{(diào)函數(shù)執(zhí)行時(shí)DLL可能已經(jīng)被卸載
// 6. 類(lèi)似函數(shù):
//    _onexit(_onexit_t)  ==>  int (__clrcall * _onexit_t)(void) 
//    _onexit_m(_onexit_t_m) ==> int (__clrcall * _onexit_m_t)(void) 
//    其中,_onexit是微軟的擴(kuò)展;ANSI程序則應(yīng)使用atexit;對(duì)于混合模式,則可使用_onexit_m版本
void Run_atexit_Sample(void)
{
    cout 
<< "[RUN_ATEXIT_SAMPLE] Enter Run_atexit_Sample()" << endl;
    cout 
<< "[RUN_ATEXIT_SAMPLE] Call atexit() first by ExitProc_1, then by ExitProc_2" << endl;
    atexit(ExitProc_1);
    atexit(ExitProc_2);

    cout 
<< "[RUN_ATEXIT_SAMPLE] Leave Run_atexit_Sample()" << endl;
}


//////////////////////////////////////////////////////////////////////////

// 如果事件得到了處理,則返回 TRUE
// 如果還需要將事件傳遞給下一個(gè)事件處理函數(shù),則返回 FALSE
BOOL WINAPI ConsoleHandler( __in DWORD dwCtrlType )
{
    
switch (dwCtrlType) {
    
case CTRL_C_EVENT: // CTRL + C
        
// 亦可通過(guò)GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0)觸發(fā)
        cout << "\n[RUN_SETCONSOLECTRLHANDLER_SAMPLE] CTRL_C_EVENT" << endl;
        
break;
    
case CTRL_BREAK_EVENT: // CTRL + BREAK
        
// 亦可通過(guò)GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0)觸發(fā)
        cout << "\n[RUN_SETCONSOLECTRLHANDLER_SAMPLE] CTRL_BREAK_EVENT" << endl;
        
break;
    
case CTRL_CLOSE_EVENT: // 關(guān)閉控制臺(tái)程序
        cout << "\n[RUN_SETCONSOLECTRLHANDLER_SAMPLE] CTRL_CLOSE_EVENT" << endl;
        
break;
    
case CTRL_LOGOFF_EVENT: // 用戶(hù)注銷(xiāo)(退出登錄)
        cout << "\n[RUN_SETCONSOLECTRLHANDLER_SAMPLE] CTRL_LOGOFF_EVENT" << endl;
        
break;
    
case CTRL_SHUTDOWN_EVENT: // 關(guān)機(jī)
        cout << "\n[RUN_SETCONSOLECTRLHANDLER_SAMPLE] CTRL_SHUTDOWN_EVENT" << endl;
        
break;
    
default:
        cout 
<< "\n[RUN_SETCONSOLECTRLHANDLER_SAMPLE] Unknown console ctrl event: " << dwCtrlType << endl;
        
break;
    }


    
return TRUE;
}


//////////////////////////////////////////////////////////////////////////

VOID ErrorExit (LPSTR lpszMessage) 

    fprintf(stderr, 
"%s\n", lpszMessage); 

    
// Restore input mode on exit.

    SetConsoleMode(hStdin, fdwSaveOldMode);

    ExitProcess(
0); 
}


VOID KeyEventProc(KEY_EVENT_RECORD ker)
{
    printf(
"Key event: ");

    
if(ker.bKeyDown)
        printf(
"key pressed\n");
    
else printf("key released\n");
}


VOID MouseEventProc(MOUSE_EVENT_RECORD mer)
{
#ifndef MOUSE_HWHEELED
#define MOUSE_HWHEELED 0x0008
#endif
    printf(
"Mouse event: ");

    
switch(mer.dwEventFlags)
    
{
    
case 0:

        
if(mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
        
{
            printf(
"left button press \n");
        }

        
else if(mer.dwButtonState == RIGHTMOST_BUTTON_PRESSED)
        
{
            printf(
"right button press \n");
        }

        
else
        
{
            printf(
"button press\n");
        }

        
break;
    
case DOUBLE_CLICK:
        printf(
"double click\n");
        
break;
    
case MOUSE_HWHEELED:
        printf(
"horizontal mouse wheel\n");
        
break;
    
case MOUSE_MOVED:
        printf(
"mouse moved\n");
        
break;
    
case MOUSE_WHEELED:
        printf(
"vertical mouse wheel\n");
        
break;
    
default:
        printf(
"unknown\n");
        
break;
    }

}


VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD wbsr)
{
    printf(
"Resize event\n");
    printf(
"Console screen buffer is %d columns by %d rows.\n", wbsr.dwSize.X, wbsr.dwSize.Y);
}


VOID Run_ReadConsoleInput_Sample( VOID )
{    
    DWORD cNumRead, fdwMode, i; 
    INPUT_RECORD irInBuf[
128]; 
    
int counter=0;

    
// Get the standard input handle. 

    hStdin 
= GetStdHandle(STD_INPUT_HANDLE); 
    
if (hStdin == INVALID_HANDLE_VALUE) 
        ErrorExit(
"GetStdHandle"); 

    
// Save the current input mode, to be restored on exit. 

    
if (! GetConsoleMode(hStdin, &fdwSaveOldMode) ) 
        ErrorExit(
"GetConsoleMode"); 

    
// Enable the window and mouse input events. 

    fdwMode 
= ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; 
    
if (! SetConsoleMode(hStdin, fdwMode) ) 
        ErrorExit(
"SetConsoleMode"); 

    
// Loop to read and handle the next 100 input events. 

    
while (counter++ <= 100
    

        
// Wait for the events. 

        
if (! ReadConsoleInput( 
                    hStdin,      
// input buffer handle 
                    irInBuf,     // buffer to read into 
                    128,         // size of read buffer 
                    &cNumRead) ) // number of records read 
            ErrorExit("ReadConsoleInput"); 

        
// Dispatch the events to the appropriate handler. 

        
for (i = 0; i < cNumRead; i++
        
{
            
switch(irInBuf[i].EventType) 
            

            
case KEY_EVENT: // keyboard input 
                KeyEventProc(irInBuf[i].Event.KeyEvent); 
                
break

            
case MOUSE_EVENT: // mouse input 
                MouseEventProc(irInBuf[i].Event.MouseEvent); 
                
break

            
case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing 
                ResizeEventProc( irInBuf[i].Event.WindowBufferSizeEvent ); 
                
break

            
case FOCUS_EVENT:  // disregard focus events 

            
case MENU_EVENT:   // disregard menu events 
                break

            
default
                ErrorExit(
"Unknown event type"); 
                
break
            }
 
        }

    }
 

    
// Restore input mode on exit.

    SetConsoleMode(hStdin, fdwSaveOldMode);
}

最后,本人還是博客新人,有什么好的意見(jiàn)或建議,還望各位能大力提點(diǎn)!!

 

posted on 2012-04-23 00:07 青碧竹 閱讀(1033) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++基礎(chǔ)


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲综合三区| 亚洲一区二区三区四区五区午夜| 玖玖国产精品视频| 久久精品女人的天堂av| 久久久www| 麻豆精品精华液| 欧美激情一区二区三区全黄| 欧美日韩国语| 国产欧美日韩免费| 亚洲视频一二三| 久久久国际精品| 欧美大片免费久久精品三p | 国产精品日韩电影| 国内成+人亚洲| 亚洲国产精品免费| 一本久久a久久精品亚洲| 亚洲专区在线| 裸体女人亚洲精品一区| 日韩视频第一页| 欧美一区二区视频97| 蜜臀a∨国产成人精品| 国产精品videossex久久发布| 国产欧美精品日韩精品| 亚洲黑丝在线| 久久精品免视看| 99精品久久免费看蜜臀剧情介绍| 性视频1819p久久| 欧美日韩色一区| 欲色影视综合吧| 午夜激情久久久| 亚洲激情视频| 欧美在线免费视频| 欧美日韩少妇| 91久久综合亚洲鲁鲁五月天| 欧美一区二视频在线免费观看| 亚洲电影在线| 久久国产88| 国产乱码精品一区二区三| 最新高清无码专区| 久久久国产一区二区| 亚洲午夜电影网| 欧美激情中文不卡| 激情av一区二区| 欧美专区日韩视频| 国产精品99久久久久久久久| 欧美精品一区二区三区一线天视频| 国产亚洲aⅴaaaaaa毛片| 亚洲一级一区| 日韩亚洲精品电影| 欧美另类99xxxxx| 亚洲人久久久| 亚洲成人在线视频播放 | 久久久精品动漫| 国产精品亚洲激情| 宅男噜噜噜66一区二区| 亚洲电影观看| 久久亚洲综合| 亚洲电影天堂av| 欧美成人免费播放| 久久综合99re88久久爱| 激情成人中文字幕| 久久精品毛片| 亚洲欧美日韩国产综合精品二区| 欧美伦理a级免费电影| 老司机免费视频久久| 一本大道久久a久久精二百| 欧美成人首页| 亚洲人成网站777色婷婷| 欧美国产日韩精品| 美女国产精品| 一本色道久久综合亚洲精品不卡 | 久久蜜桃香蕉精品一区二区三区| 亚洲在线视频| 国产一区二区欧美| 麻豆av福利av久久av| 久久一区激情| 日韩视频一区二区三区在线播放免费观看 | 亚洲欧美日韩在线观看a三区| 99伊人成综合| 国产精品色网| 久久久人成影片一区二区三区观看| 亚洲一区二区视频在线| 亚洲视频网在线直播| 国模私拍一区二区三区| 欧美成人免费播放| 欧美精品播放| 校园激情久久| 久久夜色精品一区| 亚洲伊人伊色伊影伊综合网| 欧美一级视频一区二区| 亚洲国产精品国自产拍av秋霞 | 狼狼综合久久久久综合网| 狼人社综合社区| 亚洲图片你懂的| 久久久久久91香蕉国产| 一区二区三区四区国产| 亚洲欧美日韩电影| 亚洲国产黄色片| 亚洲午夜女主播在线直播| 国内一区二区三区| 99riav1国产精品视频| 黄色影院成人| 亚洲无限乱码一二三四麻| 在线精品亚洲| 亚洲一区二区精品视频| 亚洲精品在线视频观看| 欧美一区二区黄| 亚洲私人影院| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲一区二区三区四区视频 | 欧美一区二区视频在线观看| 亚洲免费精彩视频| 久久久免费精品视频| 亚洲欧美国产精品专区久久| 美女国产精品| 欧美国产日韩二区| 久久综合伊人77777| 老色鬼久久亚洲一区二区| 欧美一级艳片视频免费观看| 欧美激情亚洲综合一区| 毛片一区二区| 国产在线播放一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在| 狠狠色丁香久久婷婷综合丁香| 亚洲一级在线| 亚洲专区一区| 欧美三级视频在线观看| 亚洲国产三级| 亚洲每日更新| 欧美激情第9页| 亚洲黄页一区| 亚洲美女视频网| 欧美人与性动交α欧美精品济南到| 欧美成熟视频| 亚洲裸体视频| 欧美色图天堂网| 亚洲一区二区三区精品视频| 亚洲自拍16p| 国产精品一级二级三级| 亚洲欧美不卡| 久久乐国产精品| 在线看不卡av| 欧美精品一区二区高清在线观看| 欧美v国产在线一区二区三区| 一区二区在线不卡| 巨乳诱惑日韩免费av| 欧美大尺度在线观看| 亚洲美女av网站| 欧美美女bb生活片| 这里只有精品在线播放| 欧美在线看片| 在线看无码的免费网站| 欧美福利视频网站| 亚洲看片免费| 久久不射2019中文字幕| 在线成人h网| 欧美日韩综合在线| 香蕉国产精品偷在线观看不卡| 久久久夜色精品亚洲| 最新国产乱人伦偷精品免费网站| 欧美精品一区二区三区四区| 亚洲欧美日本国产专区一区| 久久一区二区三区四区| 亚洲理伦在线| 国产主播精品在线| 欧美a一区二区| 99re成人精品视频| 久久av一区二区三区漫画| 亚洲成人在线视频网站| 欧美日韩亚洲一区二区三区在线观看| 亚洲午夜久久久久久久久电影网| 玖玖玖国产精品| 夜夜精品视频| 伊人一区二区三区久久精品| 欧美日韩国产一区二区| 亚洲在线观看视频| 亚洲高清不卡在线观看| 新67194成人永久网站| 亚洲精品乱码久久久久久日本蜜臀| 国产精品第13页| 久久免费午夜影院| 亚洲性感美女99在线| 亚洲国产精品久久人人爱蜜臀| 欧美在线视频不卡| 一区二区三区 在线观看视频| 国产专区精品视频| 欧美午夜视频| 亚洲国产精品久久91精品| 欧美精品日韩| 久久精品亚洲乱码伦伦中文| 99亚洲视频| 亚洲黄页一区| 欧美激情一二三区| 久久久女女女女999久久| 亚洲免费影视| 99视频一区二区| 亚洲第一福利社区| 国产一区视频在线观看免费| 国产精品毛片a∨一区二区三区|国| 欧美mv日韩mv亚洲|