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

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

移転してみました。
スレッドやコンポーネントなどを追加してってます。
http://bcb.client.jp/

PR

マウスカーソルの位置を利用してウィンドウハンドルを取得してみる

GetCursorPos    マウスカーソルの位置を取得
WindowFromPoint 指定座標にあるウィンドウハンドルを取得

windowfrompoint.png


←こんな感じでフォームを作ってみた







TEdit名   HandleEdit, TitleEdit
TButton名 WindowFromPointBtnとしました。

WindowFromPointBtnを押すとマウスカーソル位置の
ウィンドウハンドルとタイトルが表示されます。

試しにメモ帳を起動して、マウスカーソルをメモ帳の
タイトルバー上に持って行き、
EnterキーでWindowFromPointBtnを押してやります。
すると、メモ帳のハンドルとタイトルが表示されるのです。




<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::WindowFromPointBtnClick(TObject *Sender)
{
    POINT pt;

    // マウスカーソルの位置をスクリーン座標で取得
    GetCursorPos(&pt);

    // カーソル位置からウィンドウハンドル取得
    HWND hWnd = WindowFromPoint(pt);

    // 後はいつも通りの表示処理を行う
    int  tLen    = GetWindowTextLength(hWnd) + 2;   // タイトル文字長取得
    char *sTitle = (char *)malloc(tLen);            // タイトル格納用領域確保
    GetWindowText(hWnd, sTitle, tLen);              // タイトル取得

    // Editに表示
    HandleEdit->Text = IntToHex((int)hWnd, 8);
    TitleEdit->Text  = sTitle;

    // 解放
    free(sTitle);
}
//---------------------------------------------------------------------------

アクティブウィンドウハンドルの取得と
次のZ順位のウィンドウハンドルを取得を試してみる

GetActiveWindow アクティブウィンドウのハンドルを取得
GetNextWindow  指定されたハンドルの次の順位のウィンドウハンドルを取得

getactivewindow.png


←こんな感じでフォームを作ってみた









TEdit名   ActiveHandleEdit, NextHandleEdit, ActiveTitleEdit, NextTitleEdit
TButton名 GetHandleBtnとしました。

GetHandleBtnを押すと、アクティブウィンドウのハンドルとタイトル、
及び次の順位となるハンドルとタイトルを表示してくれます。

ボタンを押すときは常に自アプリがアクティブウィンドウとなる為
表示されるハンドルとタイトルは自アプリのものです。
また、次のハンドルはspy++などで見ると、確かに次のハンドルが表示されています。


作ってはみたものの、、これはあんまし使えないですな。。
もうちょっと別の使い方を考えねば。





<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::GetHandleBtnClick(TObject *Sender)
{

    // アクティブウィンドウのハンドルを取得
    HWND acthWnd  = GetActiveWindow();

    // アクティブウィンドウの次の順位のウィンドウハンドルを取得
    HWND nexthWnd = GetNextWindow(acthWnd, GW_HWNDNEXT);


    // 確認の為、ハンドルからタイトルを取得します
    // 前回と同様にタイトル長を取得
    int actLen  = GetWindowTextLength(acthWnd)  + 2;
    int nextLen = GetWindowTextLength(nexthWnd) + 2;

    // タイトル格納用に確保
    char *actTitle  = (char *)malloc(actLen);
    char *nextTitle = (char *)malloc(nextLen);

    // それぞれのタイトル取得
    GetWindowText(acthWnd,  actTitle,  actLen);
    GetWindowText(nexthWnd, nextTitle, nextLen);

    // Editコンポーネントへ表示
    ActiveHandleEdit->Text = IntToHex((int)acthWnd, 8);
    NextHandleEdit->Text   = IntToHex((int)nexthWnd,8);

    ActiveTitleEdit->Text = actTitle;
    NextTitleEdit->Text   = nextTitle;

    // 領域解放
    free(actTitle);
    free(nextTitle);
}
//---------------------------------------------------------------------------

今度は全ての親ウィンドウハンドルを列挙しつつタイトルも取得してみる
EnumWindowsでハンドル列挙
GetWindowTextでハンドルからタイトルの取得

enumwindows.png

←こんな感じでフォームを作ってみた








TMemo名   Memo1
TButton名 DispHandleBtnとしました。

Memo1のプロパティ
ScrollBarsをssBothにして縦横スクロールバー表示。
Anchorsを全てtrueにしてフォームサイズ変更に対応。

DispHandleBtnを押すと、ズィっと取得してくれます。

前回のFindWindowでは、完全なタイトルを入力しないと
ハンドルを返してくれなかったのですが、
今回はハンドルを列挙する為、列挙されたハンドルから
指定の文字列とタイトルを比較すれば、
欲しいウィンドウハンドルを取得できたりと、応用できます。

<Unit1.cpp>
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

// コールバック関数宣言
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::DispHandleBtnClick(TObject *Sender)
{
    // 画面上のウィンドウハンドルを全て列挙します
    EnumWindows((WNDENUMPROC)EnumWindowsProc, 0);
}
//---------------------------------------------------------------------------
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
    char *sTitle;
    int TitleLength;

    // タイトルの文字数を取得します
    TitleLength = GetWindowTextLength(hWnd) + 2;

    // タイトル格納用の領域確保
    sTitle = (char *)malloc(TitleLength);

    // ハンドルからタイトルを取得
    GetWindowText(hWnd, sTitle, TitleLength);

    // ハンドルとタイトルをMemo1へ表示
    AnsiString str = IntToHex((int)hWnd, 8) + " : " + sTitle;
    Form1->Memo1->Lines->Add(str);

    // 領域解放
    free(sTitle);

    // 列挙を続ける場合、TRUEを返します
    return TRUE;
}
//---------------------------------------------------------------------------

ウィンドウのタイトルからウィンドウハンドルを取得してみる

findhandle.png


←こんな感じでフォームを作ってみた







TEdit名   TitleEdit, HandleEdit
TButton名 FindhandleBtnとしました。

前回のようにSpy++や、Winspector Spyというツールを使用すれば
楽にハンドルが分かりますが、やはり自前で取得しないと、なかなか使い道が無いです。

試しに今回もメモ帳を起動します。
上側のタイトルバーに表示されている文字「無題 - メモ帳」を
TitleEditに入力します。
で、FindHandleBtnを押せば、ウィンドウハンドルが表示されます。

findhandle_result.png



←結果はこんな感じ

 




こいつと、前回作成したアプリを終了させるコードを組み合わせると
タイトルを入力すればアプリを終了させれるツールが作れるわけです。

補足:IntToHex((int)hWnd, 8)について
   第1引数は16進数にしたいint型、第2引数は何桁表示にしたいかです。
   今回は8桁に指定している為、上位2桁は"00"と表示されています。

<Unit1.h>
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE 管理のコンポーネント
    TLabel *TitleLabel;
    TEdit *TitleEdit;
    TButton *FindHandleBtn;
    TEdit *HandleEdit;
    TLabel *HandleLabel;
    void __fastcall FindHandleBtnClick(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::FindHandleBtnClick(TObject *Sender)
{
   
// タイトルを取得します
    AnsiString sTitle = TitleEdit->Text;

    // ウィンドウのタイトルからハンドルを取得します
    HWND hWnd = FindWindow(NULL, sTitle.c_str());

    // ハンドルをEditBoxへ表示
    HandleEdit->Text = IntToHex((int)hWnd, 8);
}
//---------------------------------------------------------------------------

 

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