外部アプリコントロール

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 外部アプリコントロール

by ゲスト » 2007年1月14日(日) 08:36

> >イグトランスさん
> ノッチさんの書き込みからするとどうやらWinspectorではコントロールIDは取得出来ないみたいですね。。。
> (単に私がわかってないだけかも知れませんが^^;)
> Visual Studio・・・今、無償版が出てるみたいですがあれには入ってないんですかね?!
> 御存知の方がいらっしゃれば教えて下さい。
>
> >ノッチさん
> わざわざインストまでして頂き恐縮です。
>
> > StylesExの下に表示されるIDと言う項目がウィンドウIDになります。
> ウィンドウID以外のIDはこのアプリではわからないのでしょうか?
> ウインドウID、コントロールID、etc・・・IDがありすぎて混乱しそうです><
>
> > この項目が起動するたびに違う値になるのであれば、
> > 決まったコントロールの配置ではなく、状況に応じて配置するコントロールを変更
> > している可能性があります。
> > (ベースとなるIDから+1したIDで次々とコントロールを作成していく等)
> >
> > そうなると、IDからウィンドウハンドルを取得するのは難しいので、
> > GetWindowのGW_CHILDやGW_HWNDNEXTで探していくか、
> > EnumChildWindowでコントロールのハンドルを列挙していって
> > キャプション、クラス、スタイル、サイズ等を元に目的のウィンドウを探す、
> > という方法しか思いつきません。
> 上記のソースを御覧になって頂けばおわかりになると思うのですが
> クラス名は固定だと思うのでウィンドウハンドルまでは取得出来ているんじゃないかと思うのですが…
>
> > ちなみに何のアプリケーションを操作したいのでしょうか?
> > IEの画面とかですか?
> いえ、IEでは無いです。
> 『YSIGet』と言うダウンロード用アプリです。
> これで貼り付けを・・・と考えていました。
>
> ・YSIGet 0.99c.exe(サイズ250KB UPLOADしました)
> http://dl1.f-forge.com/file.php?id=VMTe5vydp2tY4gLuJ3oh
>
> ・アプリの説明(元ページが無いみたいなのでキャッシュから)
> http://72.14.203.104/search?q=cache:FfH ... =clnk&cd=1

by まーくん » 2006年6月20日(火) 01:59

その後、色々と調べてる内に目的のクラス名が#32768(ポップアップメニュー)なので、どうやってもメッセージが送信出来ないと言う事が理解出来ました。
(ウィンドウがアクティブになってのでクラス自体が存在していない)

SetActiveWindow等を用いる事でメッセージ送信が可能になるものでしょうか?

by ノッチ » 2006年6月15日(木) 14:44

> Visual Studio・・・今、無償版が出てるみたいですがあれには入ってないんですかね?!
> 御存知の方がいらっしゃれば教えて下さい。

これは・・・!!
と思って軽く見てみたのですが、どうやらコンパイラとかRAD環境のみで
付属のソフトはなさそうです。

> > StylesExの下に表示されるIDと言う項目がウィンドウIDになります。
> ウィンドウID以外のIDはこのアプリではわからないのでしょうか?
> ウインドウID、コントロールID、etc・・・IDがありすぎて混乱しそうです><

ウィンドウIDと表現したのが誤解を与えてしまったようです。
コントロールもウィンドウと同じものです。
ただ、親ウィンドウに配置している子ウィンドウのことをコントロールと呼んでいるだけでして。
ですのでウィンドウIDとコントロールIDは同じものと考えていただければOKです。

by まーくん » 2006年6月13日(火) 18:05

>イグトランスさん
ノッチさんの書き込みからするとどうやらWinspectorではコントロールIDは取得出来ないみたいですね。。。
(単に私がわかってないだけかも知れませんが^^;)
Visual Studio・・・今、無償版が出てるみたいですがあれには入ってないんですかね?!
御存知の方がいらっしゃれば教えて下さい。

>ノッチさん
わざわざインストまでして頂き恐縮です。

> StylesExの下に表示されるIDと言う項目がウィンドウIDになります。
ウィンドウID以外のIDはこのアプリではわからないのでしょうか?
ウインドウID、コントロールID、etc・・・IDがありすぎて混乱しそうです><

> この項目が起動するたびに違う値になるのであれば、
> 決まったコントロールの配置ではなく、状況に応じて配置するコントロールを変更
> している可能性があります。
> (ベースとなるIDから+1したIDで次々とコントロールを作成していく等)
>
> そうなると、IDからウィンドウハンドルを取得するのは難しいので、
> GetWindowのGW_CHILDやGW_HWNDNEXTで探していくか、
> EnumChildWindowでコントロールのハンドルを列挙していって
> キャプション、クラス、スタイル、サイズ等を元に目的のウィンドウを探す、
> という方法しか思いつきません。
上記のソースを御覧になって頂けばおわかりになると思うのですが
クラス名は固定だと思うのでウィンドウハンドルまでは取得出来ているんじゃないかと思うのですが…

> ちなみに何のアプリケーションを操作したいのでしょうか?
> IEの画面とかですか?
いえ、IEでは無いです。
『YSIGet』と言うダウンロード用アプリです。
これで貼り付けを・・・と考えていました。

・YSIGet 0.99c.exe(サイズ250KB UPLOADしました)
http://dl1.f-forge.com/file.php?id=VMTe5vydp2tY4gLuJ3oh

・アプリの説明(元ページが無いみたいなのでキャッシュから)
http://72.14.203.104/search?q=cache:FfH ... =clnk&cd=1

by ノッチ » 2006年6月13日(火) 14:10

Winspectorをインストールして見てみました。
左のツリービューでアイテムを右クリック→Propertiesを選択すると
StylesExの下に表示されるIDと言う項目がウィンドウIDになります。
この項目が起動するたびに違う値になるのであれば、
決まったコントロールの配置ではなく、状況に応じて配置するコントロールを変更
している可能性があります。
(ベースとなるIDから+1したIDで次々とコントロールを作成していく等)

そうなると、IDからウィンドウハンドルを取得するのは難しいので、
GetWindowのGW_CHILDやGW_HWNDNEXTで探していくか、
EnumChildWindowでコントロールのハンドルを列挙していって
キャプション、クラス、スタイル、サイズ等を元に目的のウィンドウを探す、
という方法しか思いつきません。

ちなみに何のアプリケーションを操作したいのでしょうか?
IEの画面とかですか?

by イグトランス » 2006年6月12日(月) 22:57

毎回違う値になってしまうのであればそれは違うでしょうね。スレッドIDかプロセスIDでしょうか。

私はSpy++を使っていますが,コントロールIDという項目がありました。
#残念ながらこれはVisual Studio付属のものでフリーではありません。

by まーくん » 2006年6月12日(月) 17:53

> コントロールIDもそのWinspectorなどのソフトで調べられると思います。
えっ、もしや"ID"と書かれてる物でしょうか?
9桁の数字が表示されてるのですが、目的のアプリを起動する都度このID?!が変わってしまうのですが…

by イグトランス » 2006年6月12日(月) 17:48

コントロールIDもそのWinspectorなどのソフトで調べられると思います。

by まーくん » 2006年6月12日(月) 17:40

色々と調べてる時にイグトランスさんが少し前に投稿されてたコードが使えそうだったので試した所、メモ帳では上手く動作したのですが他のアプリに変更するとダメです。
(イグトランスさんコード拝借いたしました^^;)

>このようなソフトを使用して、親ウィンドウのクラスと目的のコントロールのIDを調べて
>EnumWindowで親ウィンドウのハンドルを取得、そのハンドルをからGetDlgItemで
>コントロールのハンドルを取得すればOKです。
親ウィンドウのクラスは判明したのですが、目的のコントロールIDがわかりません
ソフトをインストして無いとわからないとは思うのですがコントロールIDは何処に表示されているのでしょうか?

コード: 全て選択


#strict

Const FRAME_CLASS = "Notepad"

TypeDef BOOL = Long

TypeDef WNDENUMPROC = *Function(hwnd As HWND, lp As LPARAM) As BOOL

Declare Function EnumWindows Lib "User32" (pEnumFunc As WNDENUMPROC, lParam As LPARAM) As BOOL

Function EnumWindowsProc(hwnd As HWND, lp As LPARAM) As BOOL
    Dim className[ELM(8)] As Byte ' "Notepad"がちょうど収まる大きさ
    GetClassName(hwnd, className, Len (className))
    If lstrcmp(className, FRAME_CLASS) = 0 Then
           PostMessage(GetWindow(hwnd, GW_CHILD), WM_PASTE, 0, 0)
    End If
    EnumWindowsProc = TRUE
End Function

EnumWindows(AddressOf(EnumWindowsProc), 0)

by まーくん » 2006年6月09日(金) 18:35

> こういったソフトはプログラミング時にあると非常に便利なものなので
> インストールしておいて損はないどころかお釣りが返ってくるくらいです。
実はウィンドウハンドルを調べてる時に何を思ったか途中から『クラス名』で検索してたんですよね(笑)
それでこのアプリが引っ掛かってこれって使えそうと喜び勇んで早速インストしてみたという次第です。
ちなみにノッチさん(その他の皆さん)はこう言った便利なアプリは御存知でしたか?
(使う必要の無い方々が多いとは思いますが)

> ウィンドウを作成する時にRegisterClassExという関数を使いますが、
> その時に使用するパラメータがウィンドウクラスで、ABでは"NORMAL0"です。
> "BUTTON"や"STATIC"なんかもウィンドウクラスです。
>
> ウィンドウハンドルは作成したウィンドウを識別する番号のようなもので、
> 同じウィンドウクラスを使用してウィンドウを2つ作成したとしても、
> ウィンドウハンドルは違うものになります。
> (コントロールを同じIDで作成してもハンドルは違う値になります)
普段目にしない関数はちんぷんかんぷんですね^^;
単語を目にして初めてヘルプファイルを参照してみると言う所から入りますから
"BUTTON"はウィンドウクラスってのは未だわかるのですが"STATIC"や”メニュー”等もウィンドウクラスってのがピンときません
そう言うモノだと覚えてしまえば問題は無いのでしょうけども…

by ノッチ » 2006年6月09日(金) 18:17

> このアプリって使えそうなんですね♪
> (インストしてみて良かった 笑)

こういったソフトはプログラミング時にあると非常に便利なものなので
インストールしておいて損はないどころかお釣りが返ってくるくらいです。

> 物凄いお馬鹿な質問なんですが、クラス名とウィンドウハンドルって全く別物なんでしょうか?^^;
> (どうも頭の中でごっちゃになってしまうので)

ウィンドウを作成する時にRegisterClassExという関数を使いますが、
その時に使用するパラメータがウィンドウクラスで、ABでは"NORMAL0"です。
"BUTTON"や"STATIC"なんかもウィンドウクラスです。

ウィンドウハンドルは作成したウィンドウを識別する番号のようなもので、
同じウィンドウクラスを使用してウィンドウを2つ作成したとしても、
ウィンドウハンドルは違うものになります。
(コントロールを同じIDで作成してもハンドルは違う値になります)

by まーくん » 2006年6月09日(金) 17:13

ノッチさん、レスどうもです。

> 起動しているウィンドウのハンドルを取得するにはFindWindow、EnumWindow等
> の関数を使用して取得します。
> ウィンドウクラスとウィンドウテキストが固定であればFindWindowで取得可能ですが、
> (メモ帳のタイトルのように)ウィンドウテキストが変更するもの、複数起動するものは
> FindWindowではうまく取得できない可能性があるので、そういった場合はEnumWindow
> を使用します。
> そしてこの時に取得できるハンドルは親ウィンドウですので、目的のコントロールのハンドル
> を取得するにはGetWindowやEnumChildWindowを使用して取得します。
>
> と、ひとつの関数で一気に取得と言うわけにはいかないのです。
今、このレスを見たばっかりなので一通りちょっと調べてチャレンジしてみます。

> このようなソフトを使用して、親ウィンドウのクラスと目的のコントロールのIDを調べて
> EnumWindowで親ウィンドウのハンドルを取得、そのハンドルをからGetDlgItemで
> コントロールのハンドルを取得すればOKです。
>
> ウィンドウハンドルは起動するたびに違う値になってしまうので決め打ちはできないのですが、
> IDはソフトのバージョンアップ(これでも基本的には同じ)や動的にコントロールが増えるもの
> 以外では固定なはずなのでこれを利用するのが簡単(?)だと思います。
このアプリって使えそうなんですね♪
(インストしてみて良かった 笑)

物凄いお馬鹿な質問なんですが、クラス名とウィンドウハンドルって全く別物なんでしょうか?^^;
(どうも頭の中でごっちゃになってしまうので)

by ノッチ » 2006年6月09日(金) 15:21

> > この方法は原理上他のアプリケーションにも応用できますが,
> > コントロールが複雑に配置されている場合,目的のウィンドウハンドルを手に入れるまでがやや大変かもしれません。
> もう一歩踏み込んだ解説をお願い出来ないものでしょうか?

起動しているウィンドウのハンドルを取得するにはFindWindow、EnumWindow等
の関数を使用して取得します。
ウィンドウクラスとウィンドウテキストが固定であればFindWindowで取得可能ですが、
(メモ帳のタイトルのように)ウィンドウテキストが変更するもの、複数起動するものは
FindWindowではうまく取得できない可能性があるので、そういった場合はEnumWindow
を使用します。
そしてこの時に取得できるハンドルは親ウィンドウですので、目的のコントロールのハンドル
を取得するにはGetWindowやEnumChildWindowを使用して取得します。

と、ひとつの関数で一気に取得と言うわけにはいかないのです。


> こんなアプリを見つけたのですが、これで楽にハンドル取得って出来ないものでしょうか?
> 時間がある時で構わないので御覧になってみて下さい。
> (とりあえずインストまでは行ったのですが活用方法が・・・)

このようなソフトを使用して、親ウィンドウのクラスと目的のコントロールのIDを調べて
EnumWindowで親ウィンドウのハンドルを取得、そのハンドルをからGetDlgItemで
コントロールのハンドルを取得すればOKです。

ウィンドウハンドルは起動するたびに違う値になってしまうので決め打ちはできないのですが、
IDはソフトのバージョンアップ(これでも基本的には同じ)や動的にコントロールが増えるもの
以外では固定なはずなのでこれを利用するのが簡単(?)だと思います。

by まーくん » 2006年6月09日(金) 14:23

> 対象となるエディットコントロールのハンドルをhwndとすると,PostMessage(hwnd, WM_PASTE, 0, 0)でできます。
> また、エディットコントロールならSendMessage(hwnd, WM_SETTEXT, でクリップボードを介さず直接テキストを設定することもできます。
理解出来たのはここまでです(爆)

> そのエディットコントロールのハンドルを知る方法ですが,メモ帳の場合は,メインウィンドウにエディットコントロールが子ウィンドウとして存在するので,
> メインウィンドウのハンドルからGetWindowにGW_CHILDを指定してやれば,メモ帳のエディットコントロールのハンドルが得られます。
> 勿論メインウィンドウのハンドルを手に入れるのもまた一手間かかりますが。
>
> この方法は原理上他のアプリケーションにも応用できますが,
> コントロールが複雑に配置されている場合,目的のウィンドウハンドルを手に入れるまでがやや大変かもしれません。
もう一歩踏み込んだ解説をお願い出来ないものでしょうか?

こんなアプリを見つけたのですが、これで楽にハンドル取得って出来ないものでしょうか?
時間がある時で構わないので御覧になってみて下さい。
(とりあえずインストまでは行ったのですが活用方法が・・・)
http://www.forest.impress.co.jp/article ... ector.html

by イグトランス » 2006年6月08日(木) 18:18

対象となるエディットコントロールのハンドルをhwndとすると,PostMessage(hwnd, WM_PASTE, 0, 0)でできます。
また、エディットコントロールならSendMessage(hwnd, WM_SETTEXT, でクリップボードを介さず直接テキストを設定することもできます。

そのエディットコントロールのハンドルを知る方法ですが,メモ帳の場合は,メインウィンドウにエディットコントロールが子ウィンドウとして存在するので,
メインウィンドウのハンドルからGetWindowにGW_CHILDを指定してやれば,メモ帳のエディットコントロールのハンドルが得られます。
勿論メインウィンドウのハンドルを手に入れるのもまた一手間かかりますが。

この方法は原理上他のアプリケーションにも応用できますが,
コントロールが複雑に配置されている場合,目的のウィンドウハンドルを手に入れるまでがやや大変かもしれません。

ページトップ