[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
マウスカーソルの移動とクリックをエミュレーションさせてみる。
フォーム上のボタンを押すと、
左下のスタートボタン付近にカーソルが移動後、クリックするコード
・FormにButtonコンポーネントを配置してから。
<Unit1.cpp>
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// まずはスタートボタンの上付近に移動
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 400, 64900, 0, NULL);
// 左クリックしてみる
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL);
}
//---------------------------------------------------------------------------
・参考
VOID mouse_event(
DWORD dwFlags, // 移動とクリックのオプション
DWORD dx, // 水平位置または移動量
DWORD dy, // 垂直位置または移動量
DWORD dwData, // ホイールの移動
ULONG_PTR dwExtraInfo // アプリケーション定義の情報
);
dwFlags
MOUSEEVENTF_ABSOLUTE dx と dy の各パラメータは 0~65,535 の範囲で
正規化された絶対座標。指定無しは相対座標
左上(0,0) - 右下(65535,65535)
MOUSEEVENTF_MOVE マウスが移動したことを示します。
MOUSEEVENTF_LEFTDOWN 左ボタンが押されたことを示します。
MOUSEEVENTF_LEFTUP 左ボタンが離されたことを示します。
MOUSEEVENTF_RIGHTDOWN 右ボタンが押されたことを示します。
MOUSEEVENTF_RIGHTUP 右ボタンが離されたことを示します。
MOUSEEVENTF_MIDDLEDOWN 中央ボタンが押されたことを示します。
MOUSEEVENTF_MIDDLEUP 中央ボタンが離されたことを示します。
MOUSEEVENTF_WHEEL 移動量は、dwData パラメータで指定します。
dwData
MOUSEEVENTF_WHEELを指定した場合の移動量
120が前方、-120で後方回転
フォーム上のボタンを押すとBackSpaceキーを押した事にするコード
・FormにMemo, Buttonコンポーネントを設置しておくのです。
<Unit1.h>
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE 管理のコンポーネント
TButton *Button1;
TMemo *Memo1;
void __fastcall Button1Click(TObject *Sender);
private: // ユーザー宣言
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
<Unit1.cpp>
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->SetFocus(); // Memo1にフォーカスを移動して
keybd_event(VK_BACK,0,0,0); // バックスペースキーを押した事にする
}
//---------------------------------------------------------------------------
見たい時に、なかなか見つからなかったりするので。
#define VK_LBUTTON 0x01 #define VK_RBUTTON 0x02 #define VK_CANCEL 0x03 #define VK_MBUTTON 0x04 #define VK_BACK 0x08 #define VK_TAB 0x09 #define VK_CLEAR 0x0C #define VK_RETURN 0x0D #define VK_SHIFT 0x10 #define VK_CONTROL 0x11 #define VK_MENU 0x12 #define VK_PAUSE 0x13 #define VK_CAPITAL 0x14 #define VK_KANA 0x15 #define VK_KANJI 0x19 #define VK_ESCAPE 0x1B #define VK_CONVERT 0x1C #define VK_NONCONVERT 0x1D #define VK_SPACE 0x20 #define VK_PRIOR 0x21 #define VK_NEXT 0x22 #define VK_END 0x23 #define VK_HOME 0x24 #define VK_LEFT 0x25 #define VK_UP 0x26 #define VK_RIGHT 0x27 #define VK_DOWN 0x28 #define VK_SELECT 0x29 #define VK_PRINT 0x2A #define VK_EXECUTE 0x2B #define VK_SNAPSHOT 0x2C #define VK_INSERT 0x2D #define VK_DELETE 0x2E #define VK_HELP 0x2F #define VK_NUMPAD0 0x60 #define VK_NUMPAD1 0x61 #define VK_NUMPAD2 0x62 #define VK_NUMPAD3 0x63 #define VK_NUMPAD4 0x64 #define VK_NUMPAD5 0x65 #define VK_NUMPAD6 0x66 #define VK_NUMPAD7 0x67 #define VK_NUMPAD8 0x68 #define VK_NUMPAD9 0x69 #define VK_MULTIPLY 0x6A #define VK_ADD 0x6B #define VK_SEPARATOR 0x6C #define VK_SUBTRACT 0x6D #define VK_DECIMAL 0x6E #define VK_DIVIDE 0x6F #define VK_F1 0x70 #define VK_F2 0x71 #define VK_F3 0x72 #define VK_F4 0x73 #define VK_F5 0x74 #define VK_F6 0x75 #define VK_F7 0x76 #define VK_F8 0x77 #define VK_F9 0x78 #define VK_F10 0x79 #define VK_F11 0x7A #define VK_F12 0x7B #define VK_F13 0x7C #define VK_F14 0x7D #define VK_F15 0x7E #define VK_F16 0x7F #define VK_F17 0x80 #define VK_F18 0x81 #define VK_F19 0x82 #define VK_F20 0x83 #define VK_F21 0x84 #define VK_F22 0x85 #define VK_F23 0x86 #define VK_F24 0x87 #define VK_NUMLOCK 0x90 #define VK_SCROLL 0x91
◆フックの種類
・ローカルフック
自分のプロセスに属するスレッドのメッセージを監視
・グローバルフック(別名:システムフック or リモートフック)
別プロセスに属するスレッドのメッセージを監視
システム上の全てのスレッドのメッセージを監視
DLLにて提供しなければならない
◆実装の流れ
1.SetWindowsHookEx
(フックタイプ、フックプロシージャ、監視スレッド指定)
2.フックプロシージャ
(メッセージ取得、加工)
3.UnhookWindowsHookEx
(フック解除)
◆各関数の概要
1.SetWindowsHookEx
HHOOK SetWindowsHookEx(
int idHook, // フックタイプ
HOOKPROC lpfn, // フックプロシージャ
HINSTANCE hMod, // アプリケーションインスタンスのハンドル
DWORD dwThreadId // スレッドの識別子
);
戻り値:
成功:フックプロシージャのハンドル
失敗:NULL
第1引数:idHook -> フックタイプを指定
・WH_GETMESSAGE // PostMessage監視
・WH_CALLWNDPROC // SendMessage監視
・WH_MOUSE // マウスメッセージ監視
・WH_KEYBOARD // キーボードメッセージ監視
第2引数:lpfn -> フックプロシージャアドレス指定
第3引数:hMod -> インスタンスのハンドル指定
第4引数:dwThreadId -> 監視するスレッドID指定(0なら全スレッド)
2.フックプロシージャ
SetWindowsHookExのフックタイプ指定によって
渡されるメッセージが変わる
WH_GETMESSAGEの場合
LRESULT CALLBACK GetMsgProc(
int code, // フックコード
WPARAM wParam, // 削除オプション
LPARAM lParam // メッセージ
);
・codeが0未満の場合、メッセージを処理せずCallNextHookExに渡し
この関数の戻り値を返す
・lParamをLPMSGにてキャストし、各メッセージの値を取り出す
WH_KEYBOARDの場合
LRESULT CALLBACK KeyboardProc(
int code, // フックコード
WPARAM wParam, // 仮想キーコード
LPARAM lParam // キーストロークメッセージの情報
);
・codeが0未満の場合、メッセージを処理せずCallNextHookExに渡し
この関数の戻り値を返す
・wParamでキーを特定。
(lParam & 0x80000000)==0の場合,Keyが押されている(KeyDown)状態
(lParam & 0x80000000)==1の場合,Keyが離されている(KeyUp)状態
3.UnhookWindowsHookEx
BOOL UnhookWindowsHookEx(
HHOOK hhk // 削除対象のフックプロシージャのハンドル
);
・hhkには、SetWindowsHookEx関数の戻り値であるフックハンドルを指定
◆留意点
・Unhookする場合に必要となるフックプロシージャのハンドルは
共有メモリへ記憶させ、必ず初期化する。
例(vc):
#pragma data_seg("shared")
HHOOK g_hhk = NULL; // フックハンドル
#pragma data_seg()
#pragma comment(linker, "/section:shared,rws")