30秒以内に「わ!」と驚かすプログラム

30秒以内に「わ!」と驚かすプログラム C言語

本当にくだらくて申し訳ないが、実行するとランダムで30秒以内に「わ!」と大きなウインドウが出現して驚かすプログラムを作った。

ダウンロード

プログラムはC言語でWindows APIを使っている。
SetTimerとKillTimerを使えば一発タイマー処理が実現できる。

ただ、わたしはこれを改良して起動してから2時間後に「外で遊べ 父ちゃんより」というメッセージに変えて子どもが使うユーザアカウントに登録しておいた。

wagoout

一応こちら(注:2時間後にしか確認できません!)

スタートメニューのスタートアップにこのプログラムをそっとしのばせておけばきっと驚くに違いない。外で遊ぶかは別として。
発展型として、次は2時間後にパソコンが強制終了してしまうようにしてみようと思う。

ソースコード(Borland C++ Compiler 5.5で確認)

1/* Wa!  (c)Shuichi Takeda, 2014 */
2#include <windows.h>
3#include <stdlib.h>
4#include <time.h>
5 
6#define ID_TIMER        1
7#define TIMER_MAX       30      // タイマーの秒数(1~30秒)
8#define MESSAGE     "わ!"    // 表示する文字
9 
10LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
11 
12int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
13{
14    static TCHAR appName[] = TEXT("Wa!");
15    HWND hWnd;
16    MSG msg;
17    WNDCLASS wndclass;
18     
19    wndclass.style = CS_HREDRAW | CS_VREDRAW;
20    wndclass.lpfnWndProc = WndProc;
21    wndclass.cbClsExtra = 0;
22    wndclass.cbWndExtra = 0;
23    wndclass.hInstance = hInstance;
24    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
25    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
26    wndclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND + 1;
27    wndclass.lpszMenuName = NULL;
28    wndclass.lpszClassName = appName;
29     
30    if(!RegisterClass(&wndclass)){
31        MessageBox(NULL, TEXT("ウインドウクラスの作成に失敗しました"),
32                    NULL, MB_OK);
33        return 0;
34    }
35 
36    hWnd = CreateWindow(appName, TEXT("Wa!"),
37                        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
38                        CW_USEDEFAULT, CW_USEDEFAULT,
39                        CW_USEDEFAULT, CW_USEDEFAULT,
40                        NULL, NULL, hInstance, NULL);
41    if(hWnd == NULL){
42        MessageBox(NULL, TEXT("ウインドウの作成に失敗しました"), NULL, MB_OK);
43        return 0;
44    }
45     
46    ShowWindow(hWnd, 0);
47    UpdateWindow(hWnd);
48     
49    while(GetMessage(&msg, NULL, 0, 0)>0){
50        TranslateMessage(&msg);
51        DispatchMessage(&msg);
52    }
53    return msg.wParam;
54}
55 
56LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
57{
58    static BOOL fFlipFlop = FALSE;
59    HBRUSH hBrush;
60    HDC hdc;
61    PAINTSTRUCT ps;
62    RECT rc;
63    HFONT hFont;
64    int timer;
65 
66    srand((unsigned)time(NULL));
67    timer = (rand() % TIMER_MAX) + 1;       // 何秒後に表示するか?
68 
69    switch(message){
70        case WM_CREATE:
71            SetTimer(hwnd, ID_TIMER, timer * 1000, NULL);
72            return 0;
73        case WM_TIMER:
74            MessageBeep(-1);
75            KillTimer(hwnd, ID_TIMER);
76            InvalidateRect(hwnd, NULL, FALSE);
77            ShowWindow(hwnd, 3);    // ウインドウ最大化
78            return 0;
79        case WM_PAINT:
80            hdc = BeginPaint(hwnd, &ps);
81            GetClientRect(hwnd, &rc);
82            // フォント
83            hFont = CreateFont(
84                768 , 0 , 0 , 0 , FW_BOLD , FALSE , FALSE , FALSE ,
85                SHIFTJIS_CHARSET , OUT_DEFAULT_PRECIS ,
86                CLIP_DEFAULT_PRECIS , DEFAULT_QUALITY ,
87                VARIABLE_PITCH | FF_ROMAN , NULL
88            );
89            SelectObject(hdc , hFont);
90            // 色
91            hBrush = CreateSolidBrush(RGB(255, 255, 255));
92            FillRect(hdc, &rc, hBrush);
93            // 「わ!」と表示
94            DrawText(hdc, TEXT(MESSAGE), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
95            EndPaint(hwnd, &ps);
96            return 0;
97        case WM_DESTROY:
98            KillTimer(hwnd, ID_TIMER);
99            PostQuitMessage(0);
100            return 0;
101    }
102    return DefWindowProc(hwnd, message, wParam, lParam);
103}

コメント

タイトルとURLをコピーしました