フォーム − GetStringDlg.cpp

BOOL CGetStringDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

       〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

	// TODO: 初期化をここに追加します。

	//--------------------------------------------------
	//変数初期化
	got_time=0;
	got=false;


	//キャプションクリア
	SetDlgItemText(IDC_MOUSE_POS,"");
	SetDlgItemText(IDC_HWND,"");
	SetDlgItemText(IDC_CLASSNAME,"");
	SetDlgItemText(IDC_STATUS,"");

	//最前面表示
	//this->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
	
	//ライセンスキー登録を登録します
	int rc=RegistKey("xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx");
	//---------------------------------------------------

	return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}


void CGetStringDlg::OnBnClickedGo()
{
	StartGetInfo(true);
}


void CGetStringDlg::StartGetInfo(bool Go)
{
/*
	Go:true  ボタンキャプションで開始/停止を判定
       false 停止:OnTimer からコールされる
*/
	CString strCaption;

	GetDlgItemText(IDC_GO,strCaption);
	if(Go && strCaption.CompareNoCase("開始")==0){
		this->SetWindowText("ESCキーで停止");
		::GetAsyncKeyState(VK_ESCAPE); //空読み
		SetDlgItemText(IDC_GO,"停止");
		SetTimer(1,100,NULL);

	}else{
		KillTimer(1);
		this->SetWindowText("GetString");
		SetDlgItemText(IDC_GO,"開始");
	}
}



void CGetStringDlg::OnTimer(UINT nIDEvent)
{
	/* 取得条件
	  ・マウスが移動中では無いこと
    ・自分のフォーム上では無いこと
	   ・マウスが0.5秒以上停止したら一回だけ取得
	*/

	//エスケープキーが押された
	
	if(::GetAsyncKeyState(VK_ESCAPE)!=0){
		StartGetInfo(false);	//停止
	}

	//-------------------------------------

	POINT pos;

	CString c,c2;
	GetCursorPos(&pos);
	if((pos.x != pos_pre.x) || (pos.y != pos_pre.y)){	//移動中
		pos_pre=pos;
		c.Format("%d,%d",pos.x,pos.y);
		SetDlgItemText(IDC_MOUSE_POS,c);	//ポインタ位置
		got=false;							//未取得
		return;
	}

	int t;

	t=::GetTickCount();
	if(t<(got_time+500))	//0.5秒未満の停止
		return;


	got_time=t;

	HWND hWnd,phWnd,tmp;
	hWnd=::WindowFromPoint(pos);

	phWnd=hWnd;
	tmp=::GetParent(hWnd);
	while(tmp!=NULL){	//ポイント位置の最上位親ウィンドウを捜す
		phWnd=tmp;
		tmp=::GetParent(phWnd);
	}

	if((got==true) || (this->m_hWnd==phWnd))	//取得済み or 自分ウィンドウは撮らない
		return;

	//-----------------------------------------------
	// 取得処理メイン
	//-----------------------------------------------

	SetDlgItemText(IDC_STATUS,"取得中・・・");

	got_time=::GetTickCount();			//取得した時間

	c.Format("%d",hWnd);
	SetDlgItemText(IDC_HWND,c);			//ウィンドウハンドル

	c.Format("%d",phWnd);
	SetDlgItemText(IDC_DEBUG,c);		//トップウィンドウハンドル

	char s[1024];
	GetClassName(hWnd,s,sizeof(s));
	c.SetString(s);
	SetDlgItemText(IDC_CLASSNAME,c);	//クラス名

	//------------------------------------------
	//文字情報取得
	//------------------------------------------
	GetText(pos.x,pos.y,s,sizeof(s));
	c.SetString(s);
	SetDlgItemText(IDC_EDIT_POINT,c);	//ポイント位置直下

	GetFullText(pos.x,pos.y,s,sizeof(s));
	c.SetString(s);
	SetDlgItemText(IDC_EDIT_FULL,c);	//ポイント位置全体

	//------------------------------------------
	//ACC 情報取得
	//------------------------------------------
	c.Empty();
	
	GetAccInfo(pos.x,pos.y, s,sizeof(s),GS_ACC_INFO_NAME);
	c.Append("Name        : ");	c.Append(s); c.Append("\r\n");
	
	GetAccInfo(pos.x,pos.y, s,sizeof(s),GS_ACC_INFO_VALUE);
	c.Append("Value       : ");	c.Append(s); c.Append("\r\n");

	int accRole,accState,accChildCount,ID;

	accRole=GetAccNum(pos.x,pos.y, GS_ACC_NUM_ROLE);
	GetAccRoleText(accRole,s,sizeof(s));
	c.Append("Role        : ");	c.Append(s); c.Append("\r\n");
	
	accState=GetAccNum(pos.x,pos.y, GS_ACC_NUM_STATE);
	c.Append("State       : ");	c.AppendFormat("%x",accState); c.Append("\r\n");

	RECT lpRect;
	GetAccLocation(pos.x,pos.y, &lpRect);
	c2.Format(" %d,%d,%d,%d",lpRect.left,lpRect.top,lpRect.right,lpRect.bottom);
	c.Append("Location    :");  c.Append(c2); c.Append("\r\n");

	GetAccInfo(pos.x,pos.y, s,sizeof(s),GS_ACC_INFO_DEFAULTACTION);
	c.Append("DefAction   : ");	c.Append(s); c.Append("\r\n");

	accChildCount=GetAccNum(pos.x,pos.y, GS_ACC_NUM_CHILDCOUNT);
	c.Append("ChildCount  : ");	c.AppendFormat("%d",accChildCount); c.Append("\r\n");

	GetAccInfo(pos.x,pos.y, s,sizeof(s),GS_ACC_INFO_DESCRIPTION);
	c.Append("Description : ");	c.Append(s); c.Append("\r\n");

	switch(GetObjType(pos.x,pos.y)){
		case 1:		c2="Simple Element";break;
		case 2:		c2="Real Object";	break;
		case 3:		c2="Container";		break;
		default:	c2="";				break;
	}
	c.Append("ObjectType  : "+c2+"\r\n");

	ID=GetAccNum(pos.x,pos.y,GS_ACC_NUM_ID);
	c.Append("ID          : ");	c.AppendFormat("%d",ID); c.Append("\r\n");
	
	SetDlgItemText(IDC_EDIT_ACCINFO,c);

	//------------------------------------------
	//ウィンドウステータスバー文字取得
	//------------------------------------------
	GetStatusText(pos.x,pos.y,s,sizeof(s));
	c.SetString(s);
	SetDlgItemText(IDC_EDIT_STATUS,c);	//ステータスバー文字


	/////////////////////////////////////////////

	got=true;							//取得済み
	SetDlgItemText(IDC_STATUS,"");

}




BOOL CGetStringDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO : ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。

    switch(pMsg->message){
		case WM_KEYDOWN:	//エスケープキーを無視
			if(pMsg->wParam == VK_ESCAPE){
				return TRUE;
			}
								break;
        case WM_LBUTTONDOWN:	break;
        case WM_LBUTTONUP:		break;
        case WM_MOUSEMOVE:		break;
		default:				break;
    }

	return CDialog::PreTranslateMessage(pMsg);
}

ヘッダファイル − GetTextDll.h

//-----------------------------------------------------------
// 関数宣言

//---------------------------------------------------------------
// ポイント直下の文字列取得
//--------------------------------------
// x,y      : スクリーン座標(Pixcel)
// lpString : 文字列格納バッファアドレス
// nMaxCount: バッファサイズ
//
// 返却値   : 0:正常 -1:取得失敗 -2:バッファサイズオーバー

long GetText(long x,long y,	char * strBuf,long nMaxSize);


//---------------------------------------------------------------
// ポイント直下の全体文字列取得
//--------------------------------------
// x,y      : スクリーン座標(Pixcel)
// strBuf   : 文字列格納バッファアドレス
// nMaxCount: バッファサイズ
//
// 返却値   : 0:正常 -1:取得失敗 -2:バッファサイズオーバー

long GetFullText(long x,long y,	char * strBuf,long nMaxSize);


//---------------------------------------------------------------
// ウィンドウステータスバーテキスト取得
//--------------------------------------
// x,y      : スクリーン座標(Pixcel)
// lpString : 文字列格納バッファアドレス
// nMaxCount: バッファサイズ
//
// 返却値   : 0:正常 -1:取得失敗 -2:バッファサイズオーバー

long GetStatusText(long x,long y,	char * strBuf,long nMaxSize);


//---------------------------------------------------------------
// MSAA(Microsoft Active Accessibility)文字情報取得
//
// x,y      : スクリーン座標(Pixcel)
// strBuf   : 文字列格納バッファアドレス
// nMaxCount: バッファサイズ
// item     : 取得情報種別 上記の「パラメータ値定義」参照
//
// 返却値   : 0:正常 -1:取得失敗 -2:バッファサイズオーバー

long GetAccInfo(long x,long y,char * strBuf,long nMaxSize,long item);


//-------------------------------------------------------------
// MSAA 数値情報取得
//-------------------------------------------------------------
//
// x,y      : スクリーン座標(Pixcel)
// item     : 取得情報種別 上記の「パラメータ値定義」参照
//
// 返却値   : >=0:数値情報 -1:取得失敗 -2:バッファサイズオーバー

long GetAccNum(long x,long y,long item);


//-------------------------------------------------------------
// MSAA オブジェクト位置取得
//-------------------------------------------------------------
//
// x,y      : スクリーン座標(Pixcel)
// pxLeft,pxTop,pxWidth,pxHeight
//          : 位置情報 それそれ
//               左位置、上位置、幅、高さ(Pixcel)がセットされる
// 返却値   : 0:正常 -1:取得失敗 -2:バッファサイズオーバー

long GetAccLocation(long x,long y,RECT * lpRect);


//-------------------------------------------------------------
// Role値を文字列に変換
//-------------------------------------------------------------
//
// Role     : GetAccNum で取得した値
// strBuf   : 文字列格納バッファアドレス
// nMaxCount: バッファサイズ
//
// 返却値   : 0:正常 -1:取得失敗 -2:バッファサイズオーバー

long GetAccRoleText(long Role,char * strBuf,long nMaxSize);


//-------------------------------------------------------------
// オブジェクト種別取得
//-------------------------------------------------------------
//
// x,y      : スクリーン座標(Pixcel)
//
// 返却値   : -1:取得失敗 0:不明 1:Simple Element 2:Real Object 3:Container

long GetObjType(long x,long y);


//-------------------------------------------------------------
// ライセンスキー登録
//-------------------------------------------------------------
//
// 返却値   : 0:登録成功 -1:失敗 -2:不正ライセンス

long RegistKey( char * key);


//-------------------------------------------------------------
// 定数宣言
//-------------------------------------------------------------

// 文字情報 GetAccInfo のパラメータ item
const long GS_ACC_INFO_NAME          = 1;	// AccName
const long GS_ACC_INFO_VALUE         = 2;	// AccValue
const long GS_ACC_INFO_DESCRIPTION   = 3;	// AccDescription
const long GS_ACC_INFO_DEFAULTACTION = 4;	// AccDefaultAction

// 数値情報 GetAccNum のパラメータ item
const long GS_ACC_NUM_ROLE          = 1;		// AccRole
const long GS_ACC_NUM_STATE         = 2;		// AccState
const long GS_ACC_NUM_CHILDCOUNT    = 3;		// AccChildCount
const long GS_ACC_NUM_LOCATION      = 4;		// AccLocation
const long GS_ACC_NUM_ID			= 5;		// ID
//-------------------------------------------------------