2016年11月03日

WM_INPUTテスト

WM_INPUTを使うアレ
キーフックDLLを作らないで、グローバルフックみたいな どこでもキーを受けられるかテスト
XP以降
つかえるかなぁ〜

Unit1.h

//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
private:	// ユーザー宣言
	void __fastcall OnWmInput(TMessage &msg);
	BEGIN_MESSAGE_MAP
		VCL_MESSAGE_HANDLER(WM_INPUT, TMessage, OnWmInput)
	END_MESSAGE_MAP(TForm)
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)
{
	RAWINPUTDEVICE rid;
	::ZeroMemory( &rid, sizeof(rid) );
	rid.usUsagePage = 0x01; // <--このへんでキーボードかマウスか指定
	rid.usUsage = 0x06; // <--このへんでキーボードかマウスか指定
	//rid.dwFlags = RIDEV_NOLEGACY | RIDEV_EXINPUTSINK; // <-- RIDEV_NOLEGACYつけるかはお好みで
	rid.dwFlags = RIDEV_EXINPUTSINK;
	rid.hwndTarget = Handle;
	::RegisterRawInputDevices(&rid, 1, sizeof(rid));
}
//---------------------------------------------------------------------------
//! WM_INPUT イベントハンドラ
void __fastcall TForm1::OnWmInput(TMessage &msg)
{
	RAWINPUT raw;
	UINT sz = sizeof(raw);

	::GetRawInputData( (HRAWINPUT)msg.LParam, RID_INPUT, &raw, &sz, sizeof(raw.header) );
	// この辺の条件判定はお好みで...
	if( (raw.header.dwType == RIM_TYPEKEYBOARD) && (raw.data.keyboard.Flags & RI_KEY_BREAK) ) {
	  if( raw.data.keyboard.VKey == VK_SNAPSHOT ) { // PrintScreenキー
		::OutputDebugString(L"VK_SNAPSHOT\n");  // <-- ここ
	  }
	}
}
//---------------------------------------------------------------------------

posted by sanahi at 11:34| 滋賀 ☁| Comment(0) | TrackBack(0) | C++Builder | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

Remarks
記事中にソースコードが含まれる場合、ソースコードの再利用、改変、「オレのものにする」等は自由ですが、
ソースコードを利用して起こった問題は一切責任を負いません。(自己責任での利用となります。)
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。