忍者ブログ
Comments
[03/30 のん]
TrackBack
Counter
blogRank
忍者ブログ [PR]
http://lresult.blog.shinobi.jp/
Borland C++ Builderを用いたWindowsプログラミングメモブログ

×

[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で後方回転

PR

フォーム上のボタンを押すと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")

"LRESULT" WROTE ALL ARTICLES.
PRODUCED BY SHINOBI.JP @ SAMURAI FACTORY INC.