どのような手順を踏めば良いのでしょうか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yu-ki

どのような手順を踏めば良いのでしょうか?

#1

投稿記事 by yu-ki » 13年前

http://pieceofnostalgy.blogspot.jp/2011/10/vc_28.html

こちらのサイトに乗っているプログラムを入力してみたのですが大量にエラーが出てしまいました。
入力以外にも必要な操作があるのでしょうか?
プログラム初心者でよくわかりません。よろしくお願いします。


windows 7 core3
wisialstadio2008c++です。

jay
記事: 314
登録日時: 15年前
住所: 大阪市
連絡を取る:

Re: どのような手順を踏めば良いのでしょうか?

#2

投稿記事 by jay » 13年前

dllってことはダイナミックリンクライブラリ…?
その当たりの事はあまり詳しくないのでアレですが…

そうですね、サンプルのソースコードをそのままコピペしてビルドしたのにエラーが出るということは
恐らくライブラリの設定がおかしいのでしょう、ちゃんとインクルード出来ていないとか

とりあえずエラーの上の方20行くらいで良いので載せてもらえますか?
ただ単に「エラーが出ます」と言われてもどんなエラーか分かりませんからね(苦笑)
その辺りはフォーラムルールに書いてありますので一読ください


「質問の内容は具体的にする」と言うのは、この掲示板のルールです
初心者だから何をすればいいのか分からない、というのは仕方ないですが
だからってルールを無視していい訳ではないですからね(苦笑)
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

yu-ki

Re: どのような手順を踏めば良いのでしょうか?

#3

投稿記事 by yu-ki » 13年前

すみません、ルールをきちんと読んでいませんでした。

1>CreateRandomString.cpp(154): error C2065: 'NOTIFYICONDATA' : 定義されていない識別子です。
1>CreateRandomString.cpp(154): error C2146: 構文エラー : ';' が、識別子 'TrayIcon' の前に必要です。
1>CreateRandomString.cpp(154): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(156): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(156): error C2228: '.cbSize' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(156): error C2065: 'NOTIFYICONDATA' : 定義されていない識別子です。
1>CreateRandomString.cpp(156): error C2070: ''unknown-type'': sizeof オペランドが正しくありません。
1>CreateRandomString.cpp(157): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(157): error C2228: '.hWnd' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(158): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(158): error C2228: '.uCallbackMessage' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(159): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(159): error C2228: '.uFlags' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(159): error C2065: 'NIF_MESSAGE' : 定義されていない識別子です。
1>CreateRandomString.cpp(159): error C2065: 'NIF_ICON' : 定義されていない識別子です。
1>CreateRandomString.cpp(159): error C2065: 'NIF_TIP' : 定義されていない識別子です。
1>CreateRandomString.cpp(160): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(160): error C2228: '.uID' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(161): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(161): error C2228: '.hIcon' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(162): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(162): error C2228: '.szTip' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(164): error C2065: 'NIM_ADD' : 定義されていない識別子です。
1>CreateRandomString.cpp(164): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(164): error C3861: 'Shell_NotifyIcon': 識別子が見つかりませんでした
1>CreateRandomString.cpp(169): error C2065: 'NOTIFYICONDATA' : 定義されていない識別子です。
1>CreateRandomString.cpp(169): error C2146: 構文エラー : ';' が、識別子 'TrayIcon' の前に必要です。
1>CreateRandomString.cpp(169): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(171): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(171): error C2228: '.cbSize' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(171): error C2065: 'NOTIFYICONDATA' : 定義されていない識別子です。
1>CreateRandomString.cpp(171): error C2070: ''unknown-type'': sizeof オペランドが正しくありません。
1>CreateRandomString.cpp(172): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(172): error C2228: '.hWnd' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(173): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(173): error C2228: '.uFlags' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(174): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(174): error C2228: '.uID' の左側はクラス、構造体、共用体でなければなりません
1> 型は ''unknown-type'' です。
1>CreateRandomString.cpp(176): error C2065: 'NIM_DELETE' : 定義されていない識別子です。
1>CreateRandomString.cpp(176): error C2065: 'TrayIcon' : 定義されていない識別子です。
1>CreateRandomString.cpp(176): error C3861: 'Shell_NotifyIcon': 識別子が見つかりませんでした


このようなエラーが出てしまいました。
調べてみたところDLLと本体のプログラムをつなげる?というようなことを書いていたのですが、サイトによって方法違ったりするのでよくわかりませんでした。

jay
記事: 314
登録日時: 15年前
住所: 大阪市
連絡を取る:

Re: どのような手順を踏めば良いのでしょうか?

#4

投稿記事 by jay » 13年前

ちょっと調べてみましたが、NOTIFYICONDATA構造体と言うのはMSDNライブラリの機能のようですね
これが使えないということはつまり、MSDNライブラリの設定が出来ていないということなのでしょう
http://msdn.microsoft.com/ja-jp/library ... tify_Using


ハッキリ言って、初心者には凄く敷居が高そうですし
もっと簡単な所から一つずつ勉強していく方が無難だと思われます、コレとか…
http://www.geocities.co.jp/SiliconValle ... dowsC.html


まぁ、どうしてもと言うならば出来る範囲でお手伝いはしますけれどね(苦笑)
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: どのような手順を踏めば良いのでしょうか?

#5

投稿記事 by beatle » 13年前

プログラム自体の初心者さんということでアドバイスを書きますと、まずはC言語の入門書を買ってそれを読むのがいいと思います。
C言語の入門書で勉強していけばプログラミングの感覚がつかめて来ますので、そうしたら少し現在やりたいことにつながってくるでしょう。

はっきり言って、yu-kiさんが提示されたURLの内容は高度ですし、省略されているソースコードや手順が多いです。
プログラミングに慣れればそれらをどう解決すればいいか見えてくるはずです。
jayさんが示している「Windowsプログラミング入門」のサイトもC言語の基礎知識が必要なサイトですし、やはりまずは入門書を読みましょう。

yu-ki

Re: どのような手順を踏めば良いのでしょうか?

#6

投稿記事 by yu-ki » 13年前

以前、エラーについて質問していましたがなんとかエラーはなくなりました。しかし、キーを押しても反応がありません

dll側cpp

コード:

 CreateRandomString_KeyHook.cpp
#include "stdafx.h"
#include "CreateRandomString_KeyHook.h"
#include <stdlib.h>
#include <time.h>

void srand(unsigned seed);
int rand(void);
time_t time(time_t *timer);


#define HASH_LENGTH_DEFAULT       (10)
#define HASH_LENGTH_MIN           (3)
#define HASH_LENGTH_MAX           (1024)
#define DEFAULT_SHORTCUT_KEY_CODE ('F')
#define SEND_KEY_DOWN             (0)
#define SEND_KEY_UP               KEYEVENTF_KEYUP
#define KEY_RELEASED_MASK         (0x80000000)
#define APP_VK_DUMMY              (0xff)

CREATERANDOMSTRING_KEYHOOK_API HINSTANCE g_hInst = NULL;
CREATERANDOMSTRING_KEYHOOK_API int       g_shortcutKey = 0;
CREATERANDOMSTRING_KEYHOOK_API int       g_hashLength = 0;
CREATERANDOMSTRING_KEYHOOK_API HHOOK     g_hKeyHook = 0;

CREATERANDOMSTRING_KEYHOOK_API bool AddHook()
{
    srand((unsigned int)time(NULL));

    g_shortcutKey = DEFAULT_SHORTCUT_KEY_CODE;
    g_hashLength  = HASH_LENGTH_DEFAULT;

    g_hKeyHook = SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, g_hInst, 0);
    return g_hKeyHook != NULL;
}

CREATERANDOMSTRING_KEYHOOK_API bool RemoveHook()
{
    return UnhookWindowsHookEx(g_hKeyHook) != 0;
}

CREATERANDOMSTRING_KEYHOOK_API bool SetShortcutKey(int key)
{
    if(key < 'A' || 'Z' < key)
        return FALSE;

    g_shortcutKey = key;
    return TRUE;
}

CREATERANDOMSTRING_KEYHOOK_API bool SetHashLength(int len)
{
    if(len < HASH_LENGTH_MIN || HASH_LENGTH_MAX < len)
        return FALSE;

    g_hashLength = len;
    return TRUE;
}

// 自分が送ったSendInputを処理しないように文字列を送ったらAPP_VK_DUMMYキーを最後に「押す」
// sendMyselfがtrueの間は自分が送ったキーの情報が来ている
// 最後にさっき送ったAPP_VK_DUMMYが来るので、そこで自己処理防止をOFF
CREATERANDOMSTRING_KEYHOOK_API LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wp, LPARAM lp)
{
    static bool sendMyself = false;

    if (nCode < 0)
        return CallNextHookEx(g_hKeyHook, nCode, wp, lp);

    if(wp == APP_VK_DUMMY && !(lp & KEY_RELEASED_MASK) )
    {
        sendMyself = false;
        SendKeyEvent(APP_VK_DUMMY, SEND_KEY_UP);
        return TRUE;
    }

    if(sendMyself)
        return CallNextHookEx(g_hKeyHook, nCode, wp, lp);
    
    bool shift = GetKeyState(VK_SHIFT) < 0;
    bool ctrl = GetKeyState(VK_CONTROL) < 0;

    if (shift && ctrl && wp == g_shortcutKey && !(lp & KEY_RELEASED_MASK) )
    {
        sendMyself = true;

        SendKeyEvent(VK_CONTROL, SEND_KEY_UP);
        SendKeyEvent(VK_SHIFT, SEND_KEY_UP);

        int *hash = CreateHash();

        for(int i = 0; i < g_hashLength; i++)
        {
            PushKey(hash[i]);
        }

        delete hash;

        SendKeyEvent(VK_SHIFT, SEND_KEY_DOWN);
        SendKeyEvent(VK_CONTROL, SEND_KEY_DOWN);

        SendKeyEvent(APP_VK_DUMMY, SEND_KEY_DOWN);

        return TRUE;
    }

    return CallNextHookEx(g_hKeyHook, nCode, wp, lp);
}

void SendKeyEvent(int key, DWORD state)
{
    INPUT input;
    memset(&input, 0, sizeof(INPUT) );
    input.type = INPUT_KEYBOARD;
    input.ki.wVk = key;
    input.ki.dwFlags = state;
    SendInput(1, &input, sizeof(INPUT) );
}

// 他のキーイベントを考慮して1度に送らないとならないらしい
void PushKey(int key)
{
    INPUT input[4];
    memset(input, 0, sizeof(INPUT) * 4);
    if('A' <= key && key <= 'Z')
    {
        input[0].type = INPUT_KEYBOARD;
        input[0].ki.wVk = VK_SHIFT;
        input[1].type = INPUT_KEYBOARD;
        input[1].ki.wVk = key;
        input[2].type = INPUT_KEYBOARD;
        input[2].ki.wVk = key;
        input[2].ki.dwFlags = KEYEVENTF_KEYUP;
        input[3].type = INPUT_KEYBOARD;
        input[3].ki.wVk = VK_SHIFT;
        input[3].ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(4, input, sizeof(INPUT));
    }
    else
    {
        if('a' <= key && key <= 'z')
        {
            key = key - 'a' + 'A';
        }

        input[0].type = INPUT_KEYBOARD;
        input[0].ki.wVk = key;
        input[1].type = INPUT_KEYBOARD;
        input[1].ki.wVk = key;
        input[1].ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(2, input, sizeof(INPUT));
    }
}

int* CreateHash()
{
    WCHAR *charTable = TEXT("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
    int len = g_hashLength;

    int* res = new int[len];
    memset(res, 0, sizeof(int) * len);

    unsigned long long t = 0;

    for(int i = 0; i < len; i++)
    {
        if(t == 0)
        {
            t = (((unsigned long long)rand() ) << 32) | ((unsigned long long)rand());
        }

        int c = t % 62;
        t /= 62;
        res[i] = (int)charTable[c];
    }

    return res;
}
 
本体側cpp

コード:

// CreateRandomString.cpp
#include "stdafx.h"
#include <windows.h>
#include <ShellAPI.h>
#include "CreateRandomString_KeyHook.h"
#include "resource.h"

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

#define WINDOW_TITLE     TEXT("ランダム文字列(0-9a-zA-Z)を挿入")
#define WINDOW_WIDTH     (500)
#define WINDOW_HEIGHT    (70)
#define UM_TASKTRAYICON  (WM_APP + 101)
#define ID_ICON_TASKTRAY (1001)

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

WCHAR g_szClassName[] = TEXT("CreateRandomStringWin32");        //ウィンドウクラス

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
                   LPSTR lpsCmdLine, int nCmdShow)
{
    MSG msg;
    
    if (!InitApp(hCurInst))
        return FALSE;
    if (!InitInstance(hCurInst, nCmdShow)) 
        return FALSE;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

ATOM InitApp(HINSTANCE hInst)
{
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInst;
    wc.hIcon         = LoadIcon(hInst, TEXT("APP_ICON"));
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = (LPCWSTR)g_szClassName;
    wc.hIconSm       = LoadIcon(hInst, TEXT("APP_ICON"));
    return (RegisterClassEx(&wc));
}

//ウィンドウの生成

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
    HWND hWnd;

    hWnd = CreateWindowEx(
            WS_EX_TOPMOST | WS_EX_CLIENTEDGE,
            g_szClassName,
            WINDOW_TITLE,
            WS_OVERLAPPED | WS_SYSMENU,
            0,              //X座標
            0,              //Y座標
            WINDOW_WIDTH,   //幅
            WINDOW_HEIGHT,  //高さ
            NULL,           //親ウィンドウのハンドル、親を作るときはNULL
            NULL,           //メニューハンドル、クラスメニューを使うときはNULL
            hInst,
            NULL);
    if (!hWnd)
        return FALSE;
    ShowWindow(hWnd, SW_HIDE);
    UpdateWindow(hWnd);

    return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    static HINSTANCE hInst;
    WCHAR* cmdLine = NULL;
    int lc = 0;
    size_t tlen = 0;
    POINT point;
    HMENU hMenu, hSubmenu;

    switch (msg) {
    case WM_CREATE:
        hInst = ( (LPCREATESTRUCT)lp)->hInstance;

        AddHook();

        cmdLine = GetCommandLine();
        lc = cmdLine[wcslen(cmdLine) - 1];
        if('A' <= lc && lc <= 'Z')
        {
            SetShortcutKey(lc);

            tlen = wcslen(WINDOW_TITLE);
            WCHAR* title = new WCHAR[tlen + 3];
            wcscpy_s(title, tlen + 3, WINDOW_TITLE);
            title[tlen] = ' ';
            title[tlen + 1] = lc;
            title[tlen + 2] = '\0';

            SetWindowText(hWnd, title);
            RegistTaskTray(hWnd, hInst, title);

            delete title;
        }
        else
        {
            RegistTaskTray(hWnd, hInst, WINDOW_TITLE);
        }
        break;
    case WM_COMMAND:
        switch(LOWORD(wp) )
        {
        case IDM_EXIT:
            SendMessage(hWnd, WM_DESTROY, (WPARAM)0, (LPARAM)0 );
            break;
        }
        break;
    case UM_TASKTRAYICON:
        if(lp == WM_LBUTTONUP)
        {
            hMenu = LoadMenu(hInst, TEXT("IDM_POPUP") );
            hSubmenu = GetSubMenu(hMenu, 0);
            GetCursorPos(&point);
            TrackPopupMenu(hSubmenu, TPM_LEFTALIGN, point.x, point.y, 0, hWnd, NULL);
            DestroyMenu(hMenu);
        }
        break;
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
    case WM_DESTROY:
        RemoveHook();
        ReleseTaskTray(hWnd);
        PostQuitMessage(0);
        break;
    default:
        return (DefWindowProc(hWnd, msg, wp, lp));
    }
    return 0;
}

int RegistTaskTray(HWND hWnd, HINSTANCE hInst, LPCWSTR tip)
{
    NOTIFYICONDATA TrayIcon;
    
    TrayIcon.cbSize           = sizeof(NOTIFYICONDATA);
    TrayIcon.hWnd             = hWnd;
    TrayIcon.uCallbackMessage = UM_TASKTRAYICON;
    TrayIcon.uFlags           = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    TrayIcon.uID              = ID_ICON_TASKTRAY;
    TrayIcon.hIcon            = LoadIcon(hInst, TEXT("APP_ICON"));
    wcscpy_s(TrayIcon.szTip, 64, tip); // 64 ... NOTIFYICONDATA構造体の定義より
    
    return Shell_NotifyIcon(NIM_ADD, &TrayIcon);
}

int ReleseTaskTray(HWND hWnd)
{
    NOTIFYICONDATA TrayIcon;
    
    TrayIcon.cbSize = sizeof(NOTIFYICONDATA);
    TrayIcon.hWnd   = hWnd;
    TrayIcon.uFlags = 0;
    TrayIcon.uID    = ID_ICON_TASKTRAY;
    
    return Shell_NotifyIcon(NIM_DELETE , &TrayIcon);
}
 
なぜ動かないのか原因がわかりません、
よろしければ間違いの指摘、解決法を教えてください。

エクレかわああ

Re: どのような手順を踏めば良いのでしょうか?

#7

投稿記事 by エクレかわああ » 13年前

まずちゃんとcodeタグで囲ってください
見る気しません

yu-ki

Re: どのような手順を踏めば良いのでしょうか?

#8

投稿記事 by yu-ki » 13年前

DLL側cpp

コード:

#include "stdafx.h"
#include "CreateRandomString_KeyHook.h"
#include <stdlib.h>
#include <time.h>

void srand(unsigned seed);
int rand(void);
time_t time(time_t *timer);


#define HASH_LENGTH_DEFAULT       (10)
#define HASH_LENGTH_MIN           (3)
#define HASH_LENGTH_MAX           (1024)
#define DEFAULT_SHORTCUT_KEY_CODE ('F')
#define SEND_KEY_DOWN             (0)
#define SEND_KEY_UP               KEYEVENTF_KEYUP
#define KEY_RELEASED_MASK         (0x80000000)
#define APP_VK_DUMMY              (0xff)

CREATERANDOMSTRING_KEYHOOK_API HINSTANCE g_hInst = NULL;
CREATERANDOMSTRING_KEYHOOK_API int       g_shortcutKey = 0;
CREATERANDOMSTRING_KEYHOOK_API int       g_hashLength = 0;
CREATERANDOMSTRING_KEYHOOK_API HHOOK     g_hKeyHook = 0;

CREATERANDOMSTRING_KEYHOOK_API bool AddHook()
{
    srand((unsigned int)time(NULL));

    g_shortcutKey = DEFAULT_SHORTCUT_KEY_CODE;
    g_hashLength  = HASH_LENGTH_DEFAULT;

    g_hKeyHook = SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, g_hInst, 0);
    return g_hKeyHook != NULL;
}

CREATERANDOMSTRING_KEYHOOK_API bool RemoveHook()
{
    return UnhookWindowsHookEx(g_hKeyHook) != 0;
}

CREATERANDOMSTRING_KEYHOOK_API bool SetShortcutKey(int key)
{
    if(key < 'A' || 'Z' < key)
        return FALSE;

    g_shortcutKey = key;
    return TRUE;
}

CREATERANDOMSTRING_KEYHOOK_API bool SetHashLength(int len)
{
    if(len < HASH_LENGTH_MIN || HASH_LENGTH_MAX < len)
        return FALSE;

    g_hashLength = len;
    return TRUE;
}

// 自分が送ったSendInputを処理しないように文字列を送ったらAPP_VK_DUMMYキーを最後に「押す」
// sendMyselfがtrueの間は自分が送ったキーの情報が来ている
// 最後にさっき送ったAPP_VK_DUMMYが来るので、そこで自己処理防止をOFF
CREATERANDOMSTRING_KEYHOOK_API LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wp, LPARAM lp)
{
    static bool sendMyself = false;

    if (nCode < 0)
        return CallNextHookEx(g_hKeyHook, nCode, wp, lp);

    if(wp == APP_VK_DUMMY && !(lp & KEY_RELEASED_MASK) )
    {
        sendMyself = false;
        SendKeyEvent(APP_VK_DUMMY, SEND_KEY_UP);
        return TRUE;
    }

    if(sendMyself)
        return CallNextHookEx(g_hKeyHook, nCode, wp, lp);
    
    bool shift = GetKeyState(VK_SHIFT) < 0;
    bool ctrl = GetKeyState(VK_CONTROL) < 0;

    if (shift && ctrl && wp == g_shortcutKey && !(lp & KEY_RELEASED_MASK) )
    {
        sendMyself = true;

        SendKeyEvent(VK_CONTROL, SEND_KEY_UP);
        SendKeyEvent(VK_SHIFT, SEND_KEY_UP);

        int *hash = CreateHash();

        for(int i = 0; i < g_hashLength; i++)
        {
            PushKey(hash[i]);
        }

        delete hash;

        SendKeyEvent(VK_SHIFT, SEND_KEY_DOWN);
        SendKeyEvent(VK_CONTROL, SEND_KEY_DOWN);

        SendKeyEvent(APP_VK_DUMMY, SEND_KEY_DOWN);

        return TRUE;
    }

    return CallNextHookEx(g_hKeyHook, nCode, wp, lp);
}

void SendKeyEvent(int key, DWORD state)
{
    INPUT input;
    memset(&input, 0, sizeof(INPUT) );
    input.type = INPUT_KEYBOARD;
    input.ki.wVk = key;
    input.ki.dwFlags = state;
    SendInput(1, &input, sizeof(INPUT) );
}

// 他のキーイベントを考慮して1度に送らないとならないらしい
void PushKey(int key)
{
    INPUT input[4];
    memset(input, 0, sizeof(INPUT) * 4);
    if('A' <= key && key <= 'Z')
    {
        input[0].type = INPUT_KEYBOARD;
        input[0].ki.wVk = VK_SHIFT;
        input[1].type = INPUT_KEYBOARD;
        input[1].ki.wVk = key;
        input[2].type = INPUT_KEYBOARD;
        input[2].ki.wVk = key;
        input[2].ki.dwFlags = KEYEVENTF_KEYUP;
        input[3].type = INPUT_KEYBOARD;
        input[3].ki.wVk = VK_SHIFT;
        input[3].ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(4, input, sizeof(INPUT));
    }
    else
    {
        if('a' <= key && key <= 'z')
        {
            key = key - 'a' + 'A';
        }

        input[0].type = INPUT_KEYBOARD;
        input[0].ki.wVk = key;
        input[1].type = INPUT_KEYBOARD;
        input[1].ki.wVk = key;
        input[1].ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(2, input, sizeof(INPUT));
    }
}

int* CreateHash()
{
    WCHAR *charTable = TEXT("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
    int len = g_hashLength;

    int* res = new int[len];
    memset(res, 0, sizeof(int) * len);

    unsigned long long t = 0;

    for(int i = 0; i < len; i++)
    {
        if(t == 0)
        {
            t = (((unsigned long long)rand() ) << 32) | ((unsigned long long)rand());
        }

        int c = t % 62;
        t /= 62;
        res[i] = (int)charTable[c];
    }

    return res;
} 
 

yu-ki

Re: どのような手順を踏めば良いのでしょうか?

#9

投稿記事 by yu-ki » 13年前

コード:

 
#include "stdafx.h"
#include <windows.h>
#include <ShellAPI.h>
#include "CreateRandomString_KeyHook.h"
#include "resource.h"

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

#define WINDOW_TITLE     TEXT("ランダム文字列(0-9a-zA-Z)を挿入")
#define WINDOW_WIDTH     (500)
#define WINDOW_HEIGHT    (70)
#define UM_TASKTRAYICON  (WM_APP + 101)
#define ID_ICON_TASKTRAY (1001)

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

WCHAR g_szClassName[] = TEXT("CreateRandomStringWin32");        //ウィンドウクラス

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
                   LPSTR lpsCmdLine, int nCmdShow)
{
    MSG msg;
    
    if (!InitApp(hCurInst))
        return FALSE;
    if (!InitInstance(hCurInst, nCmdShow)) 
        return FALSE;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

ATOM InitApp(HINSTANCE hInst)
{
    WNDCLASSEX wc;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInst;
    wc.hIcon         = LoadIcon(hInst, TEXT("APP_ICON"));
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = (LPCWSTR)g_szClassName;
    wc.hIconSm       = LoadIcon(hInst, TEXT("APP_ICON"));
    return (RegisterClassEx(&wc));
}

//ウィンドウの生成

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
    HWND hWnd;

    hWnd = CreateWindowEx(
            WS_EX_TOPMOST | WS_EX_CLIENTEDGE,
            g_szClassName,
            WINDOW_TITLE,
            WS_OVERLAPPED | WS_SYSMENU,
            0,              //X座標
            0,              //Y座標
            WINDOW_WIDTH,   //幅
            WINDOW_HEIGHT,  //高さ
            NULL,           //親ウィンドウのハンドル、親を作るときはNULL
            NULL,           //メニューハンドル、クラスメニューを使うときはNULL
            hInst,
            NULL);
    if (!hWnd)
        return FALSE;
    ShowWindow(hWnd, SW_HIDE);
    UpdateWindow(hWnd);

    return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    static HINSTANCE hInst;
    WCHAR* cmdLine = NULL;
    int lc = 0;
    size_t tlen = 0;
    POINT point;
    HMENU hMenu, hSubmenu;

    switch (msg) {
    case WM_CREATE:
        hInst = ( (LPCREATESTRUCT)lp)->hInstance;

        AddHook();

        cmdLine = GetCommandLine();
        lc = cmdLine[wcslen(cmdLine) - 1];
        if('A' <= lc && lc <= 'Z')
        {
            SetShortcutKey(lc);

            tlen = wcslen(WINDOW_TITLE);
            WCHAR* title = new WCHAR[tlen + 3];
            wcscpy_s(title, tlen + 3, WINDOW_TITLE);
            title[tlen] = ' ';
            title[tlen + 1] = lc;
            title[tlen + 2] = '\0';

            SetWindowText(hWnd, title);
            RegistTaskTray(hWnd, hInst, title);

            delete title;
        }
        else
        {
            RegistTaskTray(hWnd, hInst, WINDOW_TITLE);
        }
        break;
    case WM_COMMAND:
        switch(LOWORD(wp) )
        {
        case IDM_EXIT:
            SendMessage(hWnd, WM_DESTROY, (WPARAM)0, (LPARAM)0 );
            break;
        }
        break;
    case UM_TASKTRAYICON:
        if(lp == WM_LBUTTONUP)
        {
            hMenu = LoadMenu(hInst, TEXT("IDM_POPUP") );
            hSubmenu = GetSubMenu(hMenu, 0);
            GetCursorPos(&point);
            TrackPopupMenu(hSubmenu, TPM_LEFTALIGN, point.x, point.y, 0, hWnd, NULL);
            DestroyMenu(hMenu);
        }
        break;
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
    case WM_DESTROY:
        RemoveHook();
        ReleseTaskTray(hWnd);
        PostQuitMessage(0);
        break;
    default:
        return (DefWindowProc(hWnd, msg, wp, lp));
    }
    return 0;
}

int RegistTaskTray(HWND hWnd, HINSTANCE hInst, LPCWSTR tip)
{
    NOTIFYICONDATA TrayIcon;
    
    TrayIcon.cbSize           = sizeof(NOTIFYICONDATA);
    TrayIcon.hWnd             = hWnd;
    TrayIcon.uCallbackMessage = UM_TASKTRAYICON;
    TrayIcon.uFlags           = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    TrayIcon.uID              = ID_ICON_TASKTRAY;
    TrayIcon.hIcon            = LoadIcon(hInst, TEXT("APP_ICON"));
    wcscpy_s(TrayIcon.szTip, 64, tip); // 64 ... NOTIFYICONDATA構造体の定義より
    
    return Shell_NotifyIcon(NIM_ADD, &TrayIcon);
}

int ReleseTaskTray(HWND hWnd)
{
    NOTIFYICONDATA TrayIcon;
    
    TrayIcon.cbSize = sizeof(NOTIFYICONDATA);
    TrayIcon.hWnd   = hWnd;
    TrayIcon.uFlags = 0;
    TrayIcon.uID    = ID_ICON_TASKTRAY;
    
    return Shell_NotifyIcon(NIM_DELETE , &TrayIcon);
}

閉鎖

“C言語何でも質問掲示板” へ戻る