oppaiの作り方

Last-modified: 2011-05-16 (月) 15:40:18

準備

  • Visual C++起動
  • 「ファイル」→「新規作成」→「プロジェクト」と選択
  • 「新しいプロジェクト」というダイアログが出てくるので、左上「プロジェクトの種類」は-「Win32」を選択。右上の「テンプレート」は「Win32プロジェクト」を選択。その他の設定はお好きに。
  • 「Win32アプリケーションウィザード -a」というダイアログが出てくるので、「次へ」をクリック。
  • 「アプリケーションの種類」がWindowsアプリケーションになっていることを確認、「追加オプション」で空のプロジェクトをチェックして「完了」をクリック。
    メニューの「プロジェクト」→「***のプロパティ」を選択。
  • 「***のプロパティページ」というダイアログが出てくるので、「構成プロパティ」の「文字セット」を「マルチバイト文字セットを使用する」に変更。

以上で準備は整いました。
ちなみにoppai.exeは

int main(){処理内容}

ではなく

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                              LPSTR lpCmdLine, int nCmdShow ){処理内容}

のように書きます.

oppaiの仕掛け方

  • 仕掛けたいパソコンを起動しAdministratorでログイン。
  • 作ったoppai.exe、その他必要なものをどこでもいいので設置(ファイルを途中で書き出したりする場合はProgramFiles以外を推奨、その他あまり変な場所には置かないほうがいい)。
    "oppai.exe"は他のプロセスと似たor同じ名前にしておくと気付かれにくいお
  • oppai.exeのショートカットを作成する。
  • 以下の場所に作成したショートカットをこっそりしのばせる。
    C:/ユーザー/ユーザー名/AppData/Roaming/Microsoft/Windows/
                           スタートメニュー/プログラム/スタートアップ/
    ちなみに「AppData」は隠しフォルダになっています。
    これ以外にもレジストリをいじるという方法もありますが、できればやめていただきたい。この方法で仕掛けたところ、妙な異変が2度連続で起こりました。というわけで書きません。

oppaiの知恵袋

  • 壁紙を変更する(基本的に画像ファイルはbmp形式のみ。vistaではjpgとかでも大丈夫)
    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "ファイル名",
                     SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
  • 使用例(壁紙をoppai.jpgに変更します)

#include<shlobj.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

                LPSTR lpCmdLine, int nCmdShow ){

    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "oppai.jpg",

                     SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);

    return 0;

}

  • 音を鳴らす
    BOOL PlaySound("ファイル名", HMODULE HInstance, DWORD fdwSound);
    • fdwSound は SND_ASYNC あたりでいい。SND_RESOURCEを指定すればリソースからでもOK。
  • フックする
    HHOOK SetWindowsHookEx(
      int idHook,        // フックタイプ
      HOOKPROC lpfn,     // フックプロシージャ
      HINSTANCE hMod,    // アプリケーションインスタンスのハンドル
      DWORD dwThreadId   // スレッドの識別子
    );
    • これを使いこなせなければ一人前のおっぱいクリエータとは言えない。
    • suwakohackもこのAPIを使用しているんだとか(卒業生談)
    • フックタイプはいろいろあるがGoogle先生に任せる。suwakoが使用したことがあるのはWH_CALLWNDPROC、WH_GETMESSAGE、WH_MOUSE。
    • フックプロシージャは自分で作成。
    • スレッドの識別子は0でOK。
    • これを使って変なことをすると強制終了しなければならない事態になることも結構あるので慣れないうちは大変。
  • ウィンドウのタイトルを変更する
    BOOL SetWindowText(HWND hWnd, LPCTSTR lpString);
    • ウィンドウだけでなくボタン等の文字も変更できる。
  • 画面上のすべてのトップレベルウィンドウを列挙する
     BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);
    • lpEnumFunc ユーザ定義のコールバック関数。EnumWindows関数を呼び出すと、各ウィンドウのハンドルが順々にこのコールバック関数に渡される。
    • lpEnumFunc はBOOL CALLBACK EnumWindowsProc(HWND hwnd , LPARAM lp)のような感じ。詳細はGoogle先生に任せる。
    • トップレベルウィンドウって何?と思った方。SetWindowsHookExを使用する前に少し勉強することをお勧めします。トップレベルウィンドウは一般的にいうウィンドウです。suwakoもあまり詳しくはありませんが、ウィンドウはたくさんのウィンドウからできています。例えば「はい」、「いいえ」、「OK」等のボタンもウィンドウです。なので適当にフックして何も考えずにSetWindowText関数でウィンドウのタイトルを「おっぱい」に変更しようとするとありとあらゆる文字が「おっぱい」になってしまいます。わかっていてそうするならいいですが、知らずにこんなことをすると、運が悪ければフリーズします。お気をつけて。
  • メッセージを送る
     BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    • SendMessageよりもことらを使ったほうがいいらしい。
    • wParamとlParamはパラメータ。詳細はGoogle先生に任せる。