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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
1018
HSP初心者外部アプリのクリックボードにメッセを送るやり方教えてください。9解決


HSP初心者

リンク

2009/10/18(Sun) 23:54:33|NO.28400

質問させていただきます。

現在外部アプリのクリップボードに文字列を送るソースを書いてるのですが、
いまいちスマートでないのでスマートなやり方教えていただけたらうれしいです。

そこでいろいろぐぐって ぷまさん のソース見つけたのですが、ぷまさん のソースでは
あらかじめボタンに文字列を設定しておくと、ボタンの数だけルーチンが増えてしまい、
ソースが膨大になってしまい困ってます。

とりあえず今できてるソースは次の通りです。



#uselib "user32.dll" #func global keybd_event "keybd_event" int, int, int, int #module #deffunc aplkey2 int k , int optKey opt=limit(optKey+15, 16, 18) if optKey : keybd_event opt, 0, 0, 0 keybd_event k, 0, 0, 0 : keybd_event k, 0, 2, 0 if optKey : keybd_event opt, 0, 2, 0 return #global screen 0,200,100 gsel 0,2 //アクティブスイッチ button gosub "ok",*mesj input code,0,0 : winmes=stat : chobj= objinfo_hwnd(winmes) stop *mesj code="mes" : objprm 1,code //インプットボックスに文字列を返す objsel winmes : sendmsg chobj, $b1, 0, -1 : sendmsg chobj, $301 gsel 0, -1 //hsp側を非アクティブにする wait 5 : aplkey2 'V', 2 //キーイベで外部クリップに送る gsel 0,2 //hsp側にハンドルを戻す return

です。

できたらAPIとかでスマートにしたいのですが、先輩方の知恵を貸していただけない
でしょうか。

よろしくお願いします。



この記事に返信する


tsuka

リンク

2009/10/19(Mon) 00:26:44|NO.28402

質問とプログラムの意図が読み取れません

外部アプリのクリップボードとはいったい何のことでしょう。クリップボードは共有です。

aplkey2の説明もないので何をする命令なのかわかりません。命令名をわかりやすくするか、説明を入れましょう。

ぷまさんのスクリプトを見つけた、とありますが、一体どのスクリプトのことでしょうか。わかりません

キーイベやメッセなどの言葉も少なくとも俺には理解できませんでした。
そのためタイトルの、外部(?)クリックボード(?)にメッセ(?)を送る、を理解することができず、回答をすることができません。



HSP初心者

リンク

2009/10/19(Mon) 00:46:20|NO.28403

すみません・・。
クリップボードは共有でした。メモリー上の領域でした。

改めて説明させていただきます。

簡単に説明すると、HSPで作ったアプリから外部のアプリ(メモ帳などその類)に文字列を
貼り付けたいだけです。

ぷまさんのソースは

http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200604/06050021.txt

です。

そこでキーイベント操作以外のやり方がないか知りたかっただけです。

すみません。どうかご教授よろしくお願いします。



a

リンク

2009/10/19(Mon) 10:39:45|NO.28411

Ctrl + V を送信してやるのがスマートと思います。

#uselib "user32.dll" #func keybd_event "keybd_event" int, int, int, int #define VK_CONTROL 0x11 #define KEYEVENTF_KEYUP 2 exec "notepad" wait 100 // 押す keybd_event VK_CONTROL, 0, 0, 0 keybd_event 'V', 0, 0, 0 wait 10 // 離す keybd_event 'V', 0, 2, 0 keybd_event VK_CONTROL, 0, 2, 0



標的が Edit コントロール等の時は

#define WM_PASTE 0x0302 sdim a, 0xFF mesbox a, 640, 480 hEdit = objinfo_hwnd(stat) wait 50 sendmsg hEdit, WM_PASTE, 0, 0
みたいな方法もあります。



他のやり方でやりたいならなら、WM_SETTEXT メッセージか、SetWindowText 関数を使って下さい。
しかしその場合汎用性を大きく失うことになります。
なぜなら WM_SETTEXT に対応していないウィンドウもあります。
Office Word とか Windows 標準のコントロールを使っていないものに多いです。



HSP初心者

リンク

2009/10/20(Tue) 00:48:49|NO.28438

ありがとうございます。
そこでもう一つ質問させてください。
このソースだと現在開かれてるエディターの文字列が対象になってますが、
これを変数などにあらかじめ登録しといてやる場合は
やはりインプットボックスに一度移してやるしかないのでしょうか?

質問ばかりですみません。
現在回らないあたまで考えたあげくできたソースは


#uselib "user32.dll" #func global keybd_event "keybd_event" int, int, int, int #module #deffunc aplkey2 int k , int optKey opt=limit(optKey+15, 16, 18) if optKey : keybd_event opt, 0, 0, 0 keybd_event k, 0, 0, 0 : keybd_event k, 0, 2, 0 if optKey : keybd_event opt, 0, 2, 0 return #global exec "notepad" wait 100 button gosub "mes",*sp hbuttonP_A = objinfo(stat, 2) button gosub "pos",*sp hbuttonP_B = objinfo(stat, 2) stop *sp switch stat case 0 pcode="mes" swbreak case 1 pcode="pos" swbreak swend input pcode,0,0 : pstc=stat : mesinp= objinfo_hwnd(pstc) hinputP = objinfo(stat, 2) objsel obj_p sendmsg mesinp, $b1, 0, -1 : sendmsg mesinp, $301 gsel 0, -1 : wait 5 : aplkey2 'V', 2 : gsel 0,2 return

て、感じです。

ソースにコメントなくてすみません。許してください_(._.)_ ユルシテ

ただ気になるのは貼り付ける際スクリーンが消えるのが気になってしかたありません。

ハンドルを指定してメッセージとして送れないものでしょうか・・。

長文になりましたがすみません。
その辺ぐぐってみます。
ありがとうございました。



SYAM

リンク

2009/10/20(Tue) 10:03:48|NO.28441

aplstr 命令を使った例です。
何にでも送信できるわけでないのが難点です。

最近ブラウザに対して文字列を選択的に送信するものが必要になって、作ったものです。



#include "hspext.as" #uselib "user32.dll" #func global GetClassName "GetClassNameA" int,int,int #func global GetWindowText "GetWindowTextA" int,int,int #func global WindowFromPoint "WindowFromPoint" int,int #func global GetParent "GetParent" int screen 0,480,56,0 : gsel 0,2 font msgothic,16 objsize 64,24 *START_APP mes "対象のウインドウ内をクリック." sdim classname,256 sdim windowtitle,256 *SELECT_WINDOW classname="" WindowFromPoint ginfo_mx,ginfo_my hnd = stat GetClassName hnd,varptr(classname),256 repeat GetParent hnd if(stat):hnd=stat:else:break loop GetWindowText hnd,varptr(windowtitle),256 stick k,,0 if(k&256){ color 255,255,255:boxf:color 0,0,0:pos 0,0 mes "target:"+windowtitle mes "class :"+classname pos 0,ginfo_winy-24:button "ワッショーイ",*ONBUTTONPASTE pos ginfo_winx-64,ginfo_winy-24:button "対象を選択",*ONBUTTONRESET goto *WAITING_CLICK } wait 10 goto *SELECT_WINDOW *WAITING_CLICK stop *ONBUTTONPASTE id = stat aplsel windowtitle,0 if(stat=0){ if (classname=="MozillaWindowClass"):idx=3:else:idx=0 aplobj classname,idx if(stat=0){ aplstr "ワッショーイ" stop } } dialog "貼れない",1,"エラー" stop *ONBUTTONRESET clrobj cls goto *START_APP



SYAM

リンク

2009/10/20(Tue) 10:38:57|NO.28444

タブブラウザ使ってたから問題が起きなかったけど、
よく考えたらこれ 同じタイトルのウインドウ2つ以上開いてたらダメじゃん……orz
やっぱりウインドウハンドル使ってまじめに対象見つけないとダメかな。

およその解説しときますと
*SELECT_WINDOW 〜 *WAITING_CLICK では、WindowsのAPIを利用して クリックした地点に見えているウインドウの、ウインドウタイトル文字列とクラス名(apl***命令で指定するもの)を取得しています。

*ONBUTTONPASTE あたりでは、HSPの apl***命令で目的のウインドウの目的のオブジェクトに文字列を設定しています。
クラス名文字列が"MozillaWindowClass"のときだけ何かしてるのが見えますが、これは対象がFirefoxだったときに同じクラス名のウインドウがいくつかあって、実際のページ表示に使われているものが4番目だったのでこんな風になっています。姑息手段なのであんまりアテにできません。



HSP初心者

リンク

2009/10/20(Tue) 17:59:37|NO.28448

おおおぉぉぉ〜〜〜〜〜
まさしくこの動作です!!!!

貼り付ける側の方がチラつかないのがGO!です!!
ありがとうございました!

昨日これに投稿してから色々調べて書いたソースがあるのですが
SendMessageA の部分が実行されません。


#uselib "user32.dll" #func global SendMessageA "SendMessageA" sptr,sptr,sptr,sptr #func WindowFromPoint "WindowFromPoint" int,int sdim mespost //文字列の格納 exec "notepad"//メモ帳を開く repeat//左クリックを監視 getkey as,1 if as=1 { WindowFromPoint ginfo(0), ginfo(1) mes stat whnd = stat //クリックしたハンドルを取得 break } wait 10 loop wait 100 mespost="できた〜〜〜" SendMessageA whnd,WM_SETTEXT,0,mespost// <--実行されない orz stop

参考にしたページは
http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_sendmessage/
です。
あれこれやってるうちに頭痛くなって未解決のまま寝てしまいましたが、
SendMessageA実行がされません。
ハンドルの取得の仕方がわるいのでしょうか?
それとも根本的に間違ってるのでしょうか・・・orz
力不足=未熟な私ですが研究のためにもご教授お願いします。



SYAM

リンク

2009/10/20(Tue) 18:19:34|NO.28449

惜しい。

WM_SETTEXT は、HSPのシステム変数の類ではありません。
このスクリプトでは、WM_SETTEXTを定義してませんから、値 0 のただの変数扱いになっています。


#define WM_SETTEXT 0x000C

を、最初あたりに足してください。



HSP初心者

リンク

2009/10/20(Tue) 19:00:40|NO.28450

はい・・。
できました^^

ありがとうございます!!!

そこで一つ気が付いたことは APIの SendMessageA を呼び出さなくても
HSPの sendmsg でも 書き込むことができると言うことが分かりました。


#uselib "user32.dll" #func WindowFromPoint "WindowFromPoint" int,int #define WM_SETTEXT 0x000C sdim text // <---文字列の格納 このbuffer はいるの?? いりますよね・・・。 exec "notepad"//メモ帳を開く repeat//左クリックを監視 getkey as,1 if as=1 { WindowFromPoint ginfo(0), ginfo(1) mes stat whnd = stat //クリックしたハンドルを取得 break } wait 10 loop wait 100 text="できた〜〜〜" sendmsg whnd, WM_SETTEXT, 0, varptr(text) stop

て、感じです。

まだまだ未熟ですが先輩方のアドバイスで一つ一つ進歩することができます。

ありがとうございました。
今後ともなにとぞよろしくお願いします。



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