Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.1) [スレッド一覧へ] |
- 日時: 2008/02/07 22:09
- 名前: neptune
- こんにちは
すごいの作ってますね。 パッと見て思ったのが、SendInputあたりはどうですか?使うのは面倒ですが。 keybd_eventより推奨されていることですし。
|
Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.2) [スレッド一覧へ] |
- 日時: 2008/02/08 00:41
- 名前: 花ちゃん
- SendInput を.NET用に移行しようと思ったのですが、CopyMemory に変わるものが見当たらず
WEB で調べても、どれもキー操作1回につき関数を1回使用しているので、結局 SendInput 関数を使っても、keybd_event を使っても同じ使い方をしているようなので、SendInput を 使っても割り込みが入ってしまう可能性があるのではないかと思い何かうまい方法がないか と思って思案しているところです。 何かいい方法ありませんか?
VB6.0 のサンプル http://hanatyan.sakura.ne.jp/vbhlp/SendInput.htm
.NET のサンプル http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=3186#3203 http://www.pinvoke.net/default.aspx/user32.SendInput
|
Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.3) [スレッド一覧へ] |
- 日時: 2008/02/08 22:22
- 名前: neptune
- こんにちは
思案済みだったんですね。私も知らないので悩んでみます。
|
Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.4) [スレッド一覧へ] |
- 日時: 2008/02/11 14:45
- 名前: neptune
- こんにちは。
結構悩んでみたんですが、万年初心者の私には、.net frameworkとSDKの両方 を解読する必要があり、根が深いようです。
と、いう事で申し訳ないですが、SendInput に関しては一先ず中断という事にします。
なお、まだ、テストまでも行き着いてはないのですが、 感触としては何とかなりそうなんで、根性があるときにチャレンジしてみます。
|
Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.5) [スレッド一覧へ] |
- 日時: 2009/12/16 20:33
- 名前: 魔界の仮面弁士
古いスレッドに反応(既に解決済みかも知れませんけれども)。
> SendInput を.NET用に移行しようと思ったのですが、 このあたりの話ですね。 http://hanatyan.sakura.ne.jp/dotnet/mouse05.htm http://hanatyan.sakura.ne.jp/vbhlp/SendInput.htm
> CopyMemory に変わるものが見当たらず 大抵は Marshal クラスで事足りるかと思います。
ただ、SendInput に使う共用体の話であれば、メモリコピーは不要で、 <StructLayout(LayoutKind.Explicit)> _ Private Structure INPUT <FieldOffset(0)> Public type As Integer <FieldOffset(4)> Public mi As MOUSEINPUT <FieldOffset(4)> Public ki As KEYBDINPUT <FieldOffset(4)> Public hi As HARDWAREINPUT End Structure のようにオフセット位置を重ねて配置するか、あるいは、 <StructLayout(LayoutKind.Sequential, Size:=28)> _ Private Structure INPUT Public type As Integer Public ki As KEYBDINPUT End Structure のようにして、構造体をキーボード専用/マウス専用にすることで対応できます。
API の部分は、 Private Declare Function SendInput Lib "user32" _ (ByVal nInputs As Integer, _ ByVal pInputs() As INPUT, _ ByVal cbsize As Integer) As Integer に対して、 SendInput(arrayINPUT.Length, arrayINPUT, Marshal.SizeOf(GetType(INPUT))) という感じで。
> '少しは使い易いように関数化してみました。 > Private Sub sKeyEventSet(nInput As Long, _ 配列で渡す代わりに、処理をクラス化して、 Dim foo As New SendInputHelper() foo.PressKey(Keys.Home) foo.ReleaseKey(Keys.Home) foo.PressKey(Keys.ShiftKey) foo.PressKey(Keys.End) foo.ReleaseKey(Keys.End) foo.ReleaseKey(Keys.ShiftKey) foo.SendStroke() のように使えるようにすると、利用側が分かりやすくなるかも。
|
Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.6) [スレッド一覧へ] |
- 日時: 2009/12/16 22:18
- 名前: 花ちゃん
>古いスレッドに反応(既に解決済みかも知れませんけれども)。
いいえ、特に必要としない事もあって、未解決のままです。
http://hanatyan.sakura.ne.jp/vbhlp/SendInput.htm 上記の
inputevents(Count).dwType = INPUT_KEYBOARD CopyMemory inputevents(Count).xi(0), keyevent, Len(keyevent) Next Count Call SendInput(nInput, inputevents(0), Len(inputevents(0))) End Sub この辺の処理につまづいてしまって。 SendInput(1, inputevents, Marshal.SizeOf(inputevents)) のような使い方をしているは 見かけたのですが、これでは、割り込みが発生してしまうので、SendInput 関数を使う意味が 無いと思い、そのような使い方を他の方もしているので、他の方法がないのかなと思い、 当時はそれで、そのままになっていたのです。
ハードルが高そうですが、暇ができたら再挑戦してみます。
|
Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.7) [スレッド一覧へ] |
- 日時: 2009/12/17 13:05
- 名前: 魔界の仮面弁士
共用体は、StructLayoutAttribute で Explicit を指定するだけで 作れますので、VB6 のようにメモリコピーで調整する必要がありません。
実際に試してみましたが、単純に Dim arrayINPUT(max) As INPUT For i As Integer = 0 To max arrayINPUT(i).dwType = INPUT_KEYBOARD With arrayINPUT(i).ki .wVk = 〜 .wScan = 〜 .dwFlags = 〜 .time = 0 .dwExtraInfo = IntPtr.Zero End With Next SendInput(arrayINPUT.Length, arrayINPUT, Marshal.SizeOf(GetType(INPUT))) とするだけで動作しました。
|
Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.8) [スレッド一覧へ] |
- 日時: 2009/12/17 18:41
- 名前: 花ちゃん
動作確認までして頂きありがとうございます。 おかげさまで、私にも動作確認する事ができました。
|
Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.9) [スレッド一覧へ] |
- 日時: 2010/01/20 19:42
- 名前: 花ちゃん
長らくほったらかしたままになっていたのですが、ようやく試験的に使って頂けるようになりましたので、自作(駄作)フリーソフト集の方に掲載しました。
http://hanatyan.sakura.ne.jp/freesoft/win32api.htm
引き続き、API関数の追加情報やバグ・間違い等のフィードバックをお願いします。
|
Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.10) [スレッド一覧へ] |
- 日時: 2010/01/26 12:19
- 名前: ひとし
こんにちは、はじめまして。
いつも、掲載されているサンプルにお世話になっております。
サンプル投稿用掲示板の「キーボード入力の自動化(SendInput 関数使用例) (VB.NET)」にて 一カ所問題がありそうな箇所がありましたので報告さしていただきます。
問題と思われる個所
・SedKeyInput処理ないのスキャンコード指定処理
Private Function SedKeyInput(ByVal wkey() As keyEvents) As Integer
(略)
.wScan = CShort(MapVirtualKey(wkey(i).kFrg, 0)) 'スキャンコードを指定 (略)
MapVirtualKeyの第一引数が、「wkey(i).kFrg」となっておりますが、 wkey(i).kCodeではないでしょうか?
kFrgはキーコードでなく、キーの動作を指定しているため、 正しいスキャンコードが設定されないと思われます。
キーコードを指定するのみで、基本的にキー入力情報の送信を行えると思いますが、 DirectInputを用いて、キー入力情報をフェッチしているソフトの場合、スキャンコードが入っていないと、 キー入力情報の検出が行えないと思います。
お手数ですが、時間のある時にでもご確認お願いします。
(こういった内容の報告どこから、ご連絡してよいものかわかりませんでしたので、雑談掲示板にて失礼させていただきます。 もし、問題があるようでしたら削除お願いします)
|
Re: VB2005用簡易 WIN32API リファレンス(ご協力依頼) (No.11) [スレッド一覧へ] |
- 日時: 2010/01/26 14:53
- 名前: 花ちゃん
>>10
>.wScan = CShort(MapVirtualKey(wkey(i).kFrg, 0)) 'スキャンコードを指定
ありがとうございます。 変数名を変えた時にコピペ間違いをしてしまったようですね。 動かなかったら気が付いていたのですが、動いてしまったものだからそのままに。
元の方は正しいので。 http://www.hanatyan.sakura.ne.jp/vbhlp/SendInput.htm http://www.hanatyan.sakura.ne.jp/vbhlp/specialkey.htm
|