【討論】這段代碼很有趣:Windows藍(lán)屏代碼
這個(gè)是在學(xué)習(xí)windows程序設(shè)計(jì)時(shí),偶然發(fā)現(xiàn)的。程序運(yùn)行后,在滾動(dòng)條上右擊,在彈出的快捷菜單中選擇“滾動(dòng)至此”,接下來(lái)程序會(huì)提示3次的"藍(lán)屏死機(jī)!請(qǐng)先保存好數(shù)據(jù)!",依次點(diǎn)3次確定后,windows?xp就藍(lán)屏重啟了。
程序本身沒(méi)有用到特殊的api。程序也很容易理解。
藍(lán)屏的原因是在處理滾動(dòng)條消息時(shí)時(shí),MessgeBox函數(shù)造成的。但是直接在滾動(dòng)條的點(diǎn)擊并不會(huì)藍(lán)屏,具體什么原因我也不知道。估計(jì)是系統(tǒng)的bug。
VC?6.0?下編譯通過(guò),以下是代碼。
復(fù)制內(nèi)容到剪貼板代碼:
///////////////////////////////////////////////////////////////////////////?#include?<windows.h>
LRESULT?CALLBACK?WndProc?(HWND,?UINT,?WPARAM,?LPARAM)?;
int?WINAPI?WinMain?(HINSTANCE?hInstance,?HINSTANCE?hPrevInstance,
????????????????????PSTR?szCmdLine,?int?iCmdShow)
{
????????static?TCHAR?szAppName[]?=?TEXT?("MyWindow")?;
????????HWND?????????????hwnd?;
????????MSG?????????????msg?;
????????WNDCLASS?????wndclass?;
????????wndclass.style????????????????=?CS_HREDRAW?|?CS_VREDRAW?;
????????wndclass.lpfnWndProc????????=?WndProc?;
????????wndclass.cbClsExtra????????=?0?;
????????wndclass.cbWndExtra????????=?0?;
????????wndclass.hInstance????????=?hInstance?;
????????wndclass.hIcon????????????????=?LoadIcon?(NULL,?IDI_APPLICATION)?;
????????wndclass.hCursor????????=?LoadCursor?(NULL,?IDC_ARROW)?;
????????wndclass.hbrBackground????????=?(HBRUSH)?GetStockObject?(WHITE_BRUSH)?;
????????wndclass.lpszMenuName????????=?NULL?;
????????wndclass.lpszClassName????????=?szAppName?;
????????if(!RegisterClass?(&wndclass))
????????{
?????????????MessageBox?(NULL,?TEXT?("此程序必須運(yùn)行在NT下!"),?szAppName,?MB_ICONERROR)?;
?????????????return?0;
????????}
????????hwnd?=?CreateWindow?(szAppName,
?????????????????????TEXT?("藍(lán)屏死機(jī)"),?????????????
?????????????????????????????WS_OVERLAPPEDWINDOW,
?????????????????????????????CW_USEDEFAULT,
?????????????????????????????CW_USEDEFAULT,
?????????????????????????????300,
?????????????????????????????210,
?????????????????????????????NULL,
?????????????????????????????NULL,
?????????????????????????????hInstance,
?????????????????????????????NULL)?;
????????ShowWindow?(hwnd,?iCmdShow)?;
????????UpdateWindow?(hwnd)?;
????????
????????while?(GetMessage?(&msg,?NULL,?0,?0))
????????{
?????????????TranslateMessage?(&msg)?;
?????????????DispatchMessage?(&msg)?;
????????}
????????return?msg.wParam?;
}
LRESULT?CALLBACK?WndProc?(HWND?hwnd,?UINT?message,?WPARAM?wParam,?LPARAM?lParam)
{
??????HDC???????????hdc?;
??????PAINTSTRUCT??ps?;
??????RECT???????????rect?;
??????static?HINSTANCE?hInstance;
??????static?HWND?hScrollBar;
??????switch?(message)
??????{
????????case?WM_CREATE:
?????????????hInstance?=?(HINSTANCE)?GetWindowLong?(hwnd,?GWL_HINSTANCE)?;?//取得實(shí)例句柄
?????????????hScrollBar?=?CreateWindow?(TEXT?("scrollbar"),?NULL,
??????????????????????????????????????????????WS_CHILD?|?WS_VISIBLE?|?WS_TABSTOP?|?SBS_VERT,????
??????????????????????????????????????????30,?30,?100,?100,?
??????????????????????????????????????????hwnd,?(HMENU)?1,?hInstance,?NULL)?;?//創(chuàng)建垂直滾動(dòng)條
?????????????return?0?;
?????????????
????????case?WM_SIZE?:
?????????????MoveWindow?(hScrollBar,?30,?30,?LOWORD?(lParam)?/?2,?HIWORD?(lParam)-50,?TRUE)?;
?????????????return?0;
?????????????
????????case?WM_VSCROLL?:
?????????????MessageBox(NULL,?TEXT("藍(lán)屏死機(jī)!請(qǐng)先保存好數(shù)據(jù)!"),TEXT("請(qǐng)先保存好數(shù)據(jù)"),?MB_OK);?//藍(lán)屏的原因就是加上了這句。去掉這句就不會(huì)藍(lán)屏了。
?????????????Sleep(500);
?????????????return?0;
????????case?WM_PAINT:
?????????????hdc?=?BeginPaint?(hwnd,?&ps)?;
?????????????GetClientRect?(hwnd,?&rect)?;
?????????????DrawText?(hdc,?TEXT?("Windows?XP下的藍(lán)屏,死機(jī)程序!"),?-1,?&rect,?DT_SINGLELINE?|?DT_CENTER);
?????????????EndPaint?(hwnd,?&ps)?;
?????????????return?0?;
????????case?WM_DESTROY:
?????????????PostQuitMessage?(0)?;
?????????????return?0?;
????????}
????????return?DefWindowProc?(hwnd,?message,?wParam,?lParam)?;
}