HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0522
Last Samui一般アプリが範囲選択している文字列の取得について11解決


Last Samui

リンク

2011/5/22(Sun) 04:18:35|NO.39337

全てのアプリケーションで範囲選択している文字列を取得する共通の命令みたいなものはあるでしょうか?

つまり、今使っているのがブラウザであったとしてもエディタであったとしても、普通は右クリック
してコピーして選択範囲の文字列を取得しますが、現在使っているアプリケーションの選択範囲の
文字列を取得するプログラムはどう作ればいいのでしょうか?

私の考えでは現在動いている最前面にあるアプリケーションのウインドウ・ハンドルを取得して、その
ウインドウ・ハンドルを使いOSに対し、『ちょっとそのアプリの選択範囲コピーしてくんない?』と
ウインドウメッセージを送れば答えが返ってくるのかなと思います。

ぶっちゃけ、そういう物が今必要なのです。
でも、これは間違いなくWindowsAPIの出番だと思いますが、初っ端からわかりません。

ウインドウ・ハンドルはマウス指定の位置ならGetClassName関数、FlashWindowEx関数を使えば良い
らしいですが私が知りたいのは、マウス指定位置のアプリではないので、どういう関数があるのかな
と思います。

WindowsAPI自体ほとんどわからないのですが、必要で何とかして作りたいのでご協力をお願いします。
まず、マウス指定の位置ではなく最前面のアプリのウインドウ・ハンドルを取得する関数の名前を
知っている人がいらっしゃったら教えて下さい。
長期戦になりそうですが、宜しくお願いします。



この記事に返信する


HK2

リンク

2011/5/22(Sun) 08:30:44|NO.39341

GetForegroundWindow
http://msdn.microsoft.com/ja-jp/library/cc364732.aspx
これでどうでしょう。
これで取得できるのはウィンドウのハンドルだけですが。



Last Samui

リンク

2011/5/22(Sun) 09:53:10|NO.39342

HKさん、有難うございます。
これが、ウインドウ・ハンドルなんですね。
あとは、このウインドウ・ハンドルを使って選択範囲のコピーのウインドウメッセージを送る事を
頑張ってみます。



doka

リンク

2011/5/22(Sun) 10:32:39|NO.39343

GetForegroundWindowでは親ウィンドウしか取得できないのでフォーカスのある子ウインドウ
はGetGUIThreadInfoで取得しないとダメです。
ほとんどのコントロールが実装しているコピー方法はCTRL+Cだと思うのでこれを送ってやるのが一番簡単な気します
メッセージでキーを送る方法もあるけどコントロールによっては効かないこともあるかもしてないので
直接キーを押してやるのが確実でしょう。

#include "user32.as" #define KEYEVENTF_KEYUP 2 #define EM_SETSEL 0xB1 #define WM_PASTE 0x302 #define VK_CONTROL 17 sdim s,10000 mesbox s,640,480 repeat //CTRL+C keybd_event VK_CONTROL,0,0,0 keybd_event 'C',0,0,0 keybd_event 'C',0,KEYEVENTF_KEYUP,0 keybd_event VK_CONTROL,0,KEYEVENTF_KEYUP,0 //クリップボードの中身をmesboxに貼り付け SendMessage objinfo_hwnd(0),EM_SETSEL,0,-1 SendMessage objinfo_hwnd(0),WM_PASTE,0,0 wait 10 loop



Last Samui

リンク

2011/5/22(Sun) 12:40:16|NO.39344

dokaさん、有難うございます。
親ウインドウではその中のどのオブジェクトか分からないので子ウインドウが必要なのですね。
でもCTRL+Cは使いたくないのです。
それは、マウスでの操作を考えているから。

恥ずかしいのであんまり言いたくなかったのですが、私の文章力が稚拙なため主旨が伝わってないようなので、
現実的な話をすると、私は最近簡単なソフトを作りました。
もう、他人が作っているんじゃないかなと思ったけれど無いようなので、偉そうにアップしました。
しかし、このソフトでは、イマイチ操作が簡単じゃ無かったのです。
簡単にするためには、クリックと同時に文字列の範囲選択部分を自動的にコピーすることが必要だと感じたのです。
そうすれば、範囲選択とクリック1つで操作できる。
そのソフトが下記の場所にあるWEB辞書検索ソフトです。
http://isdsk.com/gakuraku/suisui/raku_yahoo100b.zip
なので、CTRL+Cでは意味が無いのです。



れみはる

リンク

2011/5/22(Sun) 14:11:03|NO.39345

>でもCTRL+Cは使いたくないのです。
>それは、マウスでの操作を考えているから。
プログラムからCtrl+Cの信号を送ってやるんですよ



Last Samui

リンク

2011/5/22(Sun) 14:59:09|NO.39346

keybd_eventはaplkeyみたいなものなんですね。
わかりました。
れみはるさん、ありがとうございます。
まだ、ウインドウ・ハンドルを受け取ることで右往左往していたのでわかりませんでした。



HK2

リンク

2011/5/22(Sun) 16:05:20|NO.39347

第一引数に指定されたウィンドウを作成し、そのウィンドウに対して責任を持っているスレッドのIDのようです。
http://msdn.microsoft.com/ja-jp/library/cc364779.aspx

なお、関数名「GetWindowThreadProcessId」でYahoo!で検索をかけると、
一番最初にこのページが出てきました。


と、すでに削除されているとわかっているものにレスポンスしてみる。
削除した理由はわかりませんが、自己解決したのであればその旨を書いてほしいです。



Last Samui

リンク

2011/5/22(Sun) 16:59:13|NO.39348

まず、GetForegroundWindowを使おうと思いましたが、
dokaさんによるとGetGUIThreadInfoで取得しないといけないと言われたので、
調べてみると、それはGetWindowThreadProcessIdを使って取得しますと書いてあったんです。
そこで、私はあなたが書いたそのページと
http://www.geocities.co.jp/Playtown-Yoyo/6130/hsp/hsp-win32api.html
を見て書いて動かしたのが、先ほどの苦し紛れの

#include "user32.as" GetWindowThreadProcessId hwnd,sptr mes stat stop
です。

質問を取り消した理由は、ヘルプではhwndは現在のウィンドウハンドルと書いてあるので
何ですかと聞いても、それは貴方が作った画面のスレッドのIDだと言われると思ったのです。
しかし、それにしては走らせるたびに変わる値は、何でだろうとは思ったのですが、
多分、その時のCPUの使っている作業場所かなと思ったのです。
返答に困る意味不明のプログラムだと思ったので削除しました。



doka

リンク

2011/5/22(Sun) 18:13:39|NO.39349

Last Samuiさんがやりたいことは以下のようなことでいいのですかね。

ブラウザなどのアプリで文字列を選択した状態で、あなたの作ったソフトをクリックして起動
するとその選択した文字列に応じた結果を出す。

で、選択されている文字列を取得するために
>私の考えでは現在動いている最前面にあるアプリケーションのウインドウ・ハンドルを取得して、その
>ウインドウ・ハンドルを使いOSに対し、『ちょっとそのアプリの選択範囲コピーしてくんない?』と
>ウインドウメッセージを送れば答えが返ってくるのかなと思います。
というわけですね。
結論としては難しいと思います。
なぜなら、あなたのソフトを起動するためのアイコンをクリックした時点で、そのときに操作していた
アプリからフォーカスが外れるので、どのウィンドウから文字列を取得するのかが分からなくなります。
ホットキーを使った方法とかを考えた方がいいと思います。



Last Samui

リンク

2011/5/22(Sun) 19:29:27|NO.39352

たしかに、そうだなと思います。
なんだったら、画面表示している全部のソフトを調べ、選択範囲があれば全部取得して
リスト表示にし、そこから選択することで辞書検索するという方法もあるとは思うのですが、
それは2クリックになるし、返ってめんどうそうだし。

ま、一応考えて出来なかったので、これでおしまいにしときます。
色々、協力して頂いた皆さん、どうも有り難うございました。
この件は、今回はおしまいという事で決着することにします。
もう少し私もWindowsAPIを勉強してから、考えてみます。
本当に有難うございました。



Last Samui

リンク

2011/5/23(Mon) 16:31:42|NO.39355

閉じることを忘れていてすみません。



ONION software Copyright 1997-2023(c) All rights reserved.