So-net無料ブログ作成

タスクバーの表示/非表示 [VC]

//タスクバーの表示/非表示

HWND hWnd;

//タスクバーのウインドウハンドルを取得
hWnd = FindWindow("Shell_TrayWnd", NULL);
if(hWnd != 0) {
    //非表示
    ShowWindow(hWnd, SW_HIDE);
    //表示
    ShowWindow(hWnd, SW_SHOW);
}

//おまけ

//スタートボタンを押した時に出てくるウインドウ
hWnd = FindWindow("BaseBar", NULL)
if(hWnd != 0) {
    //ウインドウを破棄する
    SendMessage(hWnd, WM_DESTROY, 0, 0);
}

スクリーンセーバーの作成 [VC]

//スクリーンセーバーの作成
//文字の表示位置を変えるだけのスクリーンセーバー

#include <windows.h>
#include <scrnsave.h>

#pragma comment(lib, "scrnsave.lib")

HFONT hScrnFont;

HFONT DrawFont(LPSTR pszName, LONG lSize)
{
    LOGFONT lf;

    lf.lfHeight = lSize;
    lf.lfWidth = 0;
    lf.lfEscapement = 0;
    lf.lfOrientation = 0;
    lf.lfWeight = FW_NORMAL;
    lf.lfItalic = FALSE;
    lf.lfUnderline = FALSE;
    lf.lfStrikeOut = FALSE;
    lf.lfCharSet = SHIFTJIS_CHARSET;
    lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf.lfQuality = PROOF_QUALITY;
    lf.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
    lstrcpy(lf.lfFaceName, pszName);

    return CreateFontIndirect(&lf);
}

void OnPaint(HWND hWnd, HDC hDC)
{
    HFONT hFont;
    RECT rc;

    hFont = (HFONT)SelectObject(hDC, hScrnFont);

    SetBkMode(hDC, TRANSPARENT);
    SetTextColor(hDC, RGB(nRed, nGreen, nBlue));

    GetClientRect(hWnd, &rc);

    rc.top = rand() % rc.right;
    rc.left = rand() % rc.bottom;

    DrawText(hDC, "テストプログラム", -1, &rc, DT_SINGLELINE | DT_EXPANDTABS);

    SelectObject(hDC, hFont);
}

LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_CREATE:
        hScrnFont = DrawFont("MS ゴシック", 48);
        SetTimer(hWnd, 1, 10000, NULL);
        break;

    case WM_TIMER:
        InvalidateRect(hWnd, NULL, TRUE);
        break;

    case WM_PAINT:
        {
        HDC hDC;
        PAINTSTRUCT ps;

        hDC = BeginPaint(hWnd, &ps);
        OnPaint(hWnd, hDC);
        EndPaint(hWnd, &ps);
        break;
        }

    case WM_DESTROY:
        KillTimer(hWnd, 1);
        DeleteObject(hScrnFont);
        break;

    default:
        break;
    }

    return DefScreenSaverProc(hWnd, uMsg, wParam, lParam);
}

BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    return TRUE;
}

BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
    return TRUE;
}

STLのmapを引数にする [VC]

STL(標準テンプレートライブラリ)のことを最近まで知りませんでした。 使ってみると、とても便利です。
#pragma warning(disable : 4786)
#include <map>
#include <string>
using namespace std;

void SetMyName(map<int, string> &mapBuff)
{
    mapBuff[5] = "私の名前"
}

void main()
{
    map<int, string> mapName;

    SetMyName(mapName);
    printf("%s\n", mapName[5].c_str());
}
stringもvectorもmapと同じように書いて引数にする。

構造体のパディング [VC]

#pragma pack(1)
struct sample1 {
    WORD wBuf; // 2バイト
    BYTE byBuf; // 1バイト
};
#pragma pack()


sizeof(sample1) == 3


構造体のパディングをしないようにするには、
#pragma pack(1) ~ #pragma pack() で囲めば良いようです。

構造体のサイズ [VC]

struct sample1 {
    WORD wBuf; // 2バイト
    BYTE byBuf; // 1バイト
};

struct sample2 {
    WORD wBuf; // 2バイト
    BYTE byBuf1; // 1バイト
    BYTE byBuf2; // 1バイト
};


上の構造体のサイズを sizeof関数 で調べると・・・


sizeof(sample1) == 4
sizeof(sample2) == 4


に、なります。
VCのバグとかではなく構造体のパディング(詰め物)と言うものらしいです。
奇数サイズの変数は、偶数サイズにするために余分なデータを入れるみたい。

要するに構造体を作るときは、「サイズが偶数になるように作りましょう」と言う事です。
特に通信関係の処理作ってる人には重要かも??

Bitmapに描いて表示する [VC]

// 普段、画面に表示する内容は文字列ばっかりなので
// ビットマップの描画方法とかをメモ。

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HBITMAP hBmp;

    switch(uMsg) {
    case WM_CREATE:
    {
        HDC hDC:
        HDC hMemDC;

        hDC = GetDC(hWnd);
        hBmp = CreateCompatibleBitmap(hDC, 200, 100);
        hMemDC = CreateCompatibleDC(hDC);

        SelectObject(hMemDC, hBmp);
        SelectObject(hMemDC, GetStockObject(NULL_PEN));

        PatBlt(hMemDC, 0, 0, 200, 100, WHITENESS);

        DeleteDC(hMemDC);
        ReleaseDC(hWnd, hDC);
        return 0;
    }

    case WM_KEYDOWN:
        {
        HDC hDC;
        HDC hMemDC;

        hDC = GetDC(hWnd);
        hMemDC = CreateCompatibleDC(hDC);
        SelectObject(hMemDC, hBmp);

        SelectObject(hMemDC, GetStockObject(BLACK_PEN));
        Rectangle(hMemDC, 10, 10, 120, 60);

        DeleteDC(hMemDC);
        ReleaseDC(hWnd, hDC);
        return 0;
        }

    case WM_PAINT:
        {
        HDC hDC;
        HDC hMemDC;
        PAINTSTRUCT ps;

        hDC = BeginPaint(hWnd, &ps);
        hMemDC = CreateCompatibleDC(hDC);
        SelectObject(hMemDC, hBmp);

        BitBlt(hDC, 0, 0, 200, 100, hMemDC, 0, 0, SRCCOPY);

        DeleteDC(hMemDC);
        EndPaint(hWnd, &ps);
        return 0;
        }
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

パソコンの電源を切る [VC]

パソコンの電源を切る。(Windows NT以上)
OpenProcessTokenで取得したハンドルはCloseHandleで解放する。
日本語版MSDNには、そのこと書いて無いから注意!
英語版MSDN OpenProcessToken
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
BOOL bResult;

//アクセストークンを開く
bResult = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
if(! bResult) {
    return;
}

//シャットダウン特権を取得
bResult = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid)
if(! bResult) {
    CloseHandle(hToken);
    return;
}

//アクセストークンの変更を実行
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

bResult = AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)
if(! bResult) {
    CloseHandle(hToken);
    return;
}

//アクセストークンを閉じる
CloseHandle(hToken);

//パソコンの電源を切る
ExitWindowsEx(EWX_POWEROFF, 0);

OSのバージョンを取得 [VC]

OSのバージョンを取得する。
NT系でしかサポートしていない関数とかを使う場合に。
PlatformIDを見ればNT系か9x系かを判断できる。
OSVERSIONINFO OSInfo;

OSInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OSInfo);

if(OSInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) {
    // Windows NT系
}
else {
    // Windows 9x系
}

Windows 95 98 ME NT 4 2000 XP
PlatformID 1 1 1 2 2 2
MajorVersion 4 4 4 4 5 5
MinorVersion 0 10 90 0 0 1

容量の小さい実行ファイル作成 [VC]

コンソールウインドウを開いて文字を出力したりする。
デバッグ用に便利、もちろんDLLでも使用可能。

下のプログラムをコンパイルして出来た
実行ファイルのサイズは 1,024 バイトでした。
#include <windows.h>
#pragma comment(linker, "/nodefaultlib:\"libc.lib\"")
#pragma comment(linker, "/entry:\"WinMain\"")
#pragma comment(linker, "/opt:nowin98")

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
    return 0;
}

参考URL: http://www.nitoyon.com/vc/

コンソール出力 [VC]

コンソールウインドウを開いて文字を出力したりする。
デバッグ用に便利、もちろんDLLでも使用可能。
void OutputConsole(LPCSTR lpszFormat, ...)
{
    char szBuff[100];
    va_list args;

    va_start(args, lpszFormat);
    wvsprintf(szBuff, lpszFormat, args);
    va_end(args);

    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),
    szBuff, lstrlen(szBuff), NULL, NULL);
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
    // コンソールを表示
    AllocConsole();

    // コンソールへ出力
    OutputConsole("%s\n", "Hello World !!");

    // コンソールを解放
    FreeConsole();

    return 0;
}