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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1028
EFGHkeybd_eventでなくSendMessageによるキーボード送信9解決


EFGH

リンク

2013/10/28(Mon) 23:06:22|NO.57862

keybd_eventでなくSendMessageによる仮想キーの送信をしたいです。

一文字だけの入力ソースでいいのでお願いします!


#uselib "user32.dll" #cfunc FindWindow "FindWindowA" sptr, sptr #func global SendMessage "SendMessageA" sptr,sptr,sptr,sptr exec "notepad.exe" hw = FindWindow("notepad", 0) mes hw

途中まで記述しました。お願いします!



この記事に返信する


MillkeyStars

リンク

2013/10/29(Tue) 01:43:31|NO.57866

sendmsg とスクリプトに入力して、F1 キーを押せばウィンドウメッセージの送信方法はわかるはずです。

WM_KEYDOWN 及び WM_KEYUP メッセージは、下記URL を参照してください。
WM_KEYDOWN - http://chokuto.ifdef.jp/urawaza/message/WM_KEYDOWN.html
WM_KEYUP - http://chokuto.ifdef.jp/urawaza/message/WM_KEYUP.html

上記URLに送信する方法は、すべてそろっています。



EFGH

リンク

2013/10/29(Tue) 01:59:10|NO.57867

うう・・・なにもならないです。。


#uselib "user32.dll" #cfunc FindWindow "FindWindowA" sptr, sptr #func global SendMessage "SendMessageA" sptr,sptr,sptr,sptr #define WM_KEYDOWN 0x0100 #define WM_KEYUP 0x0101 exec "notepad.exe" hw = FindWindow("notepad", 0) sendmsg hw,WM_KEYDOWN,$30,0 sendmsg hw,WM_KEYUP,$30,0



fortunehill

リンク

2013/10/29(Tue) 02:10:12|NO.57868

/*ご参考(送信数値はリソースエディター等で確認できます)*/

#uselib "user32.dll" #cfunc global FindWindow "FindWindowA" sptr, sptr #func global SendMessage "SendMessageA" sptr,sptr,sptr,sptr #func global FindWindowExA "FindWindowExA" sptr,sptr,sptr,sptr ;func global PostMessageA "PostMessageA" sptr,sptr,sptr,sptr exec "notepad.exe" hw = FindWindow("notepad", 0) mes hw FindWindowExA hw,0,"Edit",0 cc = stat mes cc ; sendmsg hw,$111, 2,0 ; 2=open WM_COMMAND ss = "AAAAAAAAAAAAA" sendmsg cc,$C,0,varptr(ss) sendmsg hw,$111,25,0 ;25=selectall sendmsg hw,$111, 3,0 ; 2=save



EFGH

リンク

2013/10/29(Tue) 02:13:23|NO.57869

ありがとうございますT_T

edit?とはなんでしょうか?

今日は寝ますので明日またお返事します!



fortunehill

リンク

2013/10/29(Tue) 02:33:56|NO.57870

/*蛇足:
)寨茲量榲が EditBox に文字を表示する事であるならアクセラレーターリソースは
必要ありません。(参考リソースエディター XNResourceEditor.exe )
>keybd_eventでなくSendMessageによる仮想キーの送信をしたいです。
から目的は判りませんがアクセラレータ―を叩いてみました。
Editはクラス名と言う物でHSPで言う所のオブジェクトの基本型で
(APIの RegisterClassExA 等で定義される)
APIの GetClassNameA で取得出来ます。(HSPの場合 hspwnd0)
*/



MillkeyStars

リンク

2013/10/29(Tue) 03:23:02|NO.57871

まぁ、寝ちゃったみたいで、ただキーを入力したいだけであれば
WM_CHAR の方が楽ですけどね。

下記 fortunehillさんスクリプトの WM_CHAR 版

#uselib "user32.dll" #cfunc FindWindow "FindWindowA" sptr, sptr #cfunc FindWindowEx "FindWindowExA" sptr,sptr,sptr,sptr #define WM_CHAR 0x0102 exec "notepad.exe" hw = FindWindow("notepad",0) hw = FindWindowEx(hw,0,"Edit",0) mes "target hwnd : "+hw sendmsg hw,WM_CHAR,'a',0



EFGH

リンク

2013/10/29(Tue) 18:49:19|NO.57887

おはようございます!

たくさんのソースありがとうございます。Editの件も把握しました!

僕のできなかった


sendmsg hw,WM_KEYDOWN,$30,0 sendmsg hw,WM_KEYUP,$30,0

こちらのKEYDOWNとKEYUPの使い方は何が間違ってるんでしょうか?



ht.

リンク

2013/10/29(Tue) 20:36:08|NO.57888

FindWindow("notepad", 0)ではメモ帳のウインドウを取得していますが、
実際にテキスト入力を受け付けるのはそのウインドウが所有するエディットコントロール(HSPで言えばmesbox)
なのでFindWindowEx関数を使って更にそのハンドルを取得しそちらの方にメッセージを送信する必要があります。
また、エディットコントロールはWM_CHARメッセージによって文字入力を受け付けています。
(WM_KEYDOWNが送信された後、TranslateMessage関数によって非システムキーが再度WM_CHARとして送信される)



MillkeyStars

リンク

2013/10/30(Wed) 04:22:44|NO.57902

SendMessage(PostMessage)版作ってみたので、投稿。


#uselib "user32.dll" #cfunc global FindWindow "FindWindowA" sptr,sptr #cfunc global FindWindowEx "FindWindowExA" sptr,sptr,sptr,sptr #cfunc global MapVirtualKey "MapVirtualKeyA" sptr,sptr #func global PostMessage "PostMessageA" sptr,sptr,sptr,sptr #define global WM_KEYDOWN 0x0100 #define global WM_KEYUP 0x0101 #module Keybd_Control //指定されたウィンドウハンドルへキーコードを送信します。 // Keybd_Send p1,p2,p3 // p1 = 送る先のウィンドウハンドル // p2 = 仮想キーコード // p3 = 押す/離す フラグ #deffunc Keybd_Send int WindowHandle,int KeyVirtualCode,int Mode wVk = KeyVirtualCode wScan = MapVirtualKey(wVk,0) Put_lparam = 0 //共通用 Put_lparam |= 1 << 0 //リピートカウント(0-15ビット) Put_lparam |= wScan << 16 //スキャンコード(16-23ビット) if ( Mode = 0){ //WM_KEYDOWN用 Put_lparam |= 0 << 24 //拡張キー(24ビットのみ) // Put_lparam |= 0 << 25 //使われていません。 Put_lparam |= 0 << 29 //コンテキストコード(29ビットのみ) Put_lparam |= 0 << 30 //ボタンが通常か長押しか(30ビットのみ) Put_lparam |= 0 << 31 //変換タイプ(31ビットのみ) PostMessage WindowHandle,WM_KEYDOWN,wVk,Put_lparam } else { //WM_KEYUP用 Put_lparam |= 0 << 24 //拡張キー(24ビットのみ) // Put_lparam |= 0 << 25 //使われていません。 Put_lparam |= 0 << 29 //コンテキストコード(29ビットのみ) Put_lparam |= 1 << 30 //ボタンが通常か長押しか(30ビットのみ) Put_lparam |= 1 << 31 //変換タイプ(31ビットのみ) PostMessage WindowHandle,WM_KEYUP,wVk,Put_lparam } return #global exec "notepad.exe" hw = FindWindow("notepad",0) hw = FindWindowEx(hw,0,"Edit",0) mes "target hwnd : "+hw await 4000 TargetSendStr = "HSP3.3 HOT SOUP PROCESSOR" repeat strlen(TargetSendStr) keybd_send hw,peek(TargetSendStr,cnt),0 keybd_send hw,peek(TargetSendStr,cnt),1 loop stop

必要に応じてネットなどで調べて改造してね。
(単純に送信するだけにしてあります。キーの合成などはご自身で考えてね)



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