tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルSendInput関数が Vistaで動作しないのですが?
記事No14039
投稿日: 2009/09/17(Thu) 08:56
投稿者
SendInput関数が Vistaで動作しないのですが?
(サンプル 139 マウスを指定場所に移動しクリックする。)
上記をサンプルで exeを作成したのですが、Vistaで実行できません。
XP搭載のPCでは、問題なく動作するのですが、
Vistaではクリックの動作をしないようです。
解決方法があるのでしょうか?

[ツリー表示へ]
タイトルRe: SendInput関数が Vistaで動作しないのですが?
記事No14040
投稿日: 2009/09/17(Thu) 10:21
投稿者オショウ
> SendInput関数が Vistaで動作しないのですが?

  こちらのサンプルのコードがどうなっているか解りません
  が・・・

  .NET(VB2008)でテストしてみましたが、動作しました。
  http://www.pinvoke.net/default.aspx/user32.sendinput

  ※ PInvokeのサンプルコードには、間違いがありますので
    動作テストされる際は修正が必要でした。

  VISTA Ultimate SP1 です。

  因みに自プロセス内での話ですよネ?!
  他プロセスででしょうか・・・

  もしそうなら権限の問題です。(管理者権限が必要かは未確認)
  GetLastError取れば正確なエラー内容が取得できますので
  何のエラーが返っているのか、調べて下さい。

以上。参考まで

[ツリー表示へ]
タイトルRe^2: SendInput関数が Vistaで動作しないのですが?
記事No14042
投稿日: 2009/09/17(Thu) 10:59
投稿者魔界の仮面弁士
> > SendInput関数が Vistaで動作しないのですが?
>   こちらのサンプルのコードがどうなっているか解りません
>   が・・・

これについては、引用元が
> > (サンプル 139 マウスを指定場所に移動しクリックする。)
であると明記されていますよ。

ちなみに URL はこちら。
http://hanatyan.sakura.ne.jp/vbhlp/SendMous.htm


> GetLastError取れば正確なエラー内容が取得できますので
いえ。GetLastError API ではなく、Err.LastDllError を使う必要があります。
DLL のプロシージャのエラーコードを取得するために GetLastError は使用できません。

実際、以下のような話もありましたし。
http://hanatyan.sakura.ne.jp/logbbs1/wforum.cgi?mode=allread&no=2334&page=0


[GetLastError Function]
http://msdn.microsoft.com/en-us/library/ms679360.aspx
》 Visual Basic:  Applications should call err.LastDllError instead of GetLastError.

[Office VBA プログラマーズ ガイド]
http://msdn.microsoft.com/ja-jp/library/cc376814.aspx
》 ただし、VBA では、GetLastError 関数は不正確な結果を返す可能性があります。
》 VBA で DLL エラーの情報を取得するには、VBA の Err オブジェクトの
》 LastDLLError プロパティを使用します。


# ちなみに VB.NET の Err.LastDllError は Marshal.GetLastWin32Error() と同義です。蛇足までに。

[ツリー表示へ]
タイトルRe^2: SendInput関数が Vistaで動作しないのですが?
記事No14044
投稿日: 2009/09/17(Thu) 11:03
投稿者
早々のご返信ありがとうございました。
.NET(VB2008)だとOKなんですか。

質問ではっきりしておけばよかったのですが、
私の作ったのは VB6 でした。
今後勉強してみます。

[ツリー表示へ]
タイトルRe: SendInput関数が Vistaで動作しないのですが?
記事No14041
投稿日: 2009/09/17(Thu) 10:51
投稿者魔界の仮面弁士
> SendInput関数が Vistaで動作しないのですが?

Vista/Win7 のユーザー インターフェイス特権の分離 (UIPI) でしょうね。
http://msdn.microsoft.com/ja-jp/windows/dd871146.aspx

Vista 上での SendInput の動作について、SDK にはこのように書かれています。
》 Microsoft Windows Vista.
》 This function fails when it is blocked by
》 User Interface Privilege Isolation (UIPI).
》 Note that neither GetLastError nor the return value
》 will indicate the failure was caused by UIPI blocking.


ということで、プロセスの実行権限を確認してみてください。
また、VB6 開発環境からの実行では無く、EXE からの実行で確認してみてください。

その結果、もしも上位権限が必要なようであれば、アプリケーション マニフェストで
requestedExecutionLevel を指定してみては如何でしょうか。
(Project1.exe.manifest を生成するか、または、EXE コンパイル後に
EXE 内にマニフェスト リソースを直接埋め込むようにする)

[ツリー表示へ]
タイトルRe^2: SendInput関数が Vistaで動作しないのですが?
記事No14046
投稿日: 2009/09/17(Thu) 11:27
投稿者
魔界の仮面弁士有難うございます

> Vista/Win7 のユーザー インターフェイス特権の分離 (UIPI) でしょうね。
・・・・

勉強してみます。

[ツリー表示へ]
タイトルRe^3: SendInput関数が Vistaで動作しないのですが?
記事No14048
投稿日: 2009/09/17(Thu) 12:49
投稿者魔界の仮面弁士
実行後に、Err.LastDllError プロパティの戻り値を確認してみてください。もしも
 Const ERROR_ACCESS_DENIED As Long = 5&
が返されるようであれば、権限関係だと思います。

# それが UIPI によるものかどうかは兎も角として。

[ツリー表示へ]
タイトルRe^4: SendInput関数が Vistaで動作しないのですが?
記事No14050
投稿日: 2009/09/17(Thu) 13:20
投稿者
> 実行後に、Err.LastDllError プロパティの戻り値を確認してみてください。もしも
>  Const ERROR_ACCESS_DENIED As Long = 5&
> が返されるようであれば、権限関係だと思います。
>
> # それが UIPI によるものかどうかは兎も角として。

どうもよく解らないのですが、別にエラーが出るわけではないのです。
"Command1をクリック" ボタンをクリックすると、
単にマウスをクリックする動作が行われず、
指定の位置でマウスカーソルが止まっています。
"フォームをドラッグ" だとフォームが上下に圧縮され形で移動します。

まったく同じ EXE をXP機で実行すると、何の支障もなく正常に作動します。

[ツリー表示へ]
タイトルRe^5: SendInput関数が Vistaで動作しないのですが?
記事No14052
投稿日: 2009/09/17(Thu) 14:45
投稿者魔界の仮面弁士
> > 実行後に、Err.LastDllError プロパティの戻り値を確認してみてください。もしも
> >  Const ERROR_ACCESS_DENIED As Long = 5&
> > が返されるようであれば、権限関係だと思います。
> どうもよく解らないのですが、別にエラーが出るわけではないのです。

API の呼び出し時には通常、実行時エラーは発生しません。
実行の成否は、戻り値や Err.LastDllError で確認する事になります。

繰り返しの質問となりますが、SendInput の戻り値、および Err.LastDllError は
どのような値を返してきていますか?


> "フォームをドラッグ" だとフォームが上下に圧縮され形で移動します。

圧縮という動作を想像できなかったのですが、それはどのような状態を指しているのでしょうか?

[ツリー表示へ]
タイトルRe^6: SendInput関数が Vistaで動作しないのですが?
記事No14053
投稿日: 2009/09/17(Thu) 15:14
投稿者
> 繰り返しの質問となりますが、SendInput の戻り値、および Err.LastDllError は
> どのような値を返してきていますか?

aaa = SendInput(nInput, inputevents(0), Len(inputevents(0)))
とやると
2を返します。
Err.LastDllError は具体的にどうコードを書いていいのかわかりません。

> 圧縮という動作を想像できなかったのですが、それはどのような状態を指しているのでしょうか?

フォームの枠を残して、内側部分がなくなります。(横幅は変わらない)

[ツリー表示へ]
タイトルRe^7: SendInput関数が Vistaで動作しないのですが?
記事No14054
投稿日: 2009/09/17(Thu) 15:24
投稿者魔界の仮面弁士
> Err.LastDllError は具体的にどうコードを書いていいのかわかりません。
たとえば、「Debug.Print Err.LastDllError」とか
「Label1.Caption = CStr(Err.LastDllError)」とか。


> > 圧縮という動作を想像できなかったのですが、それはどのような状態を指しているのでしょうか?
> フォームの枠を残して、内側部分がなくなります。(横幅は変わらない)
…ごめんなさい、まだ想像できませんでした。

圧縮されたという画面イメージを、ここの[雑談用掲示板]に投稿してもらえないでしょうか?
さらに、現象を再現できる実際のコードがあれば、回答者側でも検証できるかと思います。

[ツリー表示へ]
タイトルRe^8: SendInput関数が Vistaで動作しないのですが?
記事No14055
投稿日: 2009/09/17(Thu) 16:19
投稿者
>
> 圧縮されたという画面イメージを、ここの[雑談用掲示板]に投稿してもらえないでしょうか?
> さらに、現象を再現できる実際のコードがあれば、回答者側でも検証できるかと思います。

投稿しました。(SendInput関数が Vistaで動作しないのですが)

コードはこちらです
http://hanatyan.sakura.ne.jp/vbhlp/SendMous.htm

[ツリー表示へ]
タイトルRe^9: SendInput関数が Vistaで動作しないのですが?
記事No14058
投稿日: 2009/09/17(Thu) 17:53
投稿者魔界の仮面弁士
> > 圧縮されたという画面イメージを、ここの[雑談用掲示板]に投稿してもらえないでしょうか?
> 投稿しました。(SendInput関数が Vistaで動作しないのですが)

あれ? 投稿が見当たりません。。。
http://hanatyan.sakura.ne.jp/yybbs/patio.cgi

旧雑談掲示板…では無いでしょうし、どこでしょう?


> > > フォームの枠を残して、内側部分がなくなります。(横幅は変わらない)
もしかして、フォームの枠を掴んで「フォームのサイズを変更している状態」
という意味なのでしょうか。

Vista の画面設定は、
 Windows Aero
 Windows Vista ベーシック
 Windows スタンダード
 Windows クラシック
のいずれに設定されていますか?

[ツリー表示へ]
タイトルRe^10: SendInput関数が Vistaで動作しないのですが?
記事No14060
投稿日: 2009/09/17(Thu) 19:04
投稿者
>
> 旧雑談掲示板…では無いでしょうし、どこでしょう?
>
間違って投稿してました。
今投稿しなおしました。
不思議なことに、全画面にしたり、フォームの位置をずらしてクリックすると、
投稿図のようにはなりません。クリックしても何も起りません。
XPだと全く問題ないのですが。

[ツリー表示へ]
タイトルRe^5: SendInput関数が Vistaで動作しないのですが?
記事No14056
投稿日: 2009/09/17(Thu) 17:18
投稿者花ちゃん
> どうもよく解らないのですが、別にエラーが出るわけではないのです。
> "Command1をクリック" ボタンをクリックすると、
> 単にマウスをクリックする動作が行われず、
> 指定の位置でマウスカーソルが止まっています。
> "フォームをドラッグ" だとフォームが上下に圧縮され形で移動します。

そのようになるのなら、SendInput関数は正常に動作しております。
ただ、マウスの移動位置が狂っているからと思います。
試しに、最大化してから実行するとか、直接マウスの位置を指定するか、位置を修正
して見て下さい。
(タイトルバー等の高さの違いから生じているかと)

動作しないと書かれていたので権限関係の問題と思っておりました。

[ツリー表示へ]
タイトルRe^6: SendInput関数が Vistaで動作しないのですが?
記事No14057
投稿日: 2009/09/17(Thu) 17:27
投稿者花ちゃん
> ただ、マウスの移動位置が狂っているからと思います。
> 試しに、最大化してから実行するとか、直接マウスの位置を指定するか、位置を修正
> して見て下さい。


試しに下記のように、100 づつ足して見て下さい。

    y = (Form1.Top + 200) \ Screen.TwipsPerPixelX
    x = (Form1.Left + 1100) \ Screen.TwipsPerPixelX

他の同様の部分も。

[ツリー表示へ]
タイトルRe^7: SendInput関数が Vistaで動作しないのですが?
記事No14061
投稿日: 2009/09/17(Thu) 19:27
投稿者
>>
> 試しに下記のように、100 づつ足して見て下さい。
>
>     y = (Form1.Top + 200) \ Screen.TwipsPerPixelX
>     x = (Form1.Left + 1100) \ Screen.TwipsPerPixelX
>
> 他の同様の部分も。

有難うございました。
上記に訂正すると、正常にできるようです。

ただ、私が本当に欲しい、
Private Sub Command2_Click()
'Command1ボタンをクリック
・・・
End Sub
だけはだめでした。残念。
カーソルは動くが、クリックしない。
MsgBox "Commandボタンがクリックされました"がでない。

Private Sub Command1_Click()
    MsgBox "Commandボタンがクリックされました"
End Sub
このボタンをを直接押せば、メッセージボックスは出ますが。

[ツリー表示へ]
タイトルRe^8: SendInput関数が Vistaで動作しないのですが?
記事No14062
投稿日: 2009/09/17(Thu) 19:48
投稿者花ちゃん
> ただ、私が本当に欲しい、
> Private Sub Command2_Click()
> 'Command1ボタンをクリック
> ・・・
> End Sub
> だけはだめでした。残念。
> カーソルは動くが、クリックしない。

その時のマウスカーソルは、どの位置にありますか? Command1ボタンの上に
キチンと移動していますか?

クリックしない との事ですが、なにで(どこで)確認しましたか?
(Command1ボタンの上でクリックしないから、MsgBox が表示しないのでクリック
 していないと判断していませんか?)

[ツリー表示へ]
タイトルRe^9: SendInput関数が Vistaで動作しないのですが?
記事No14063
投稿日: 2009/09/17(Thu) 19:58
投稿者
>
> その時のマウスカーソルは、どの位置にありますか? Command1ボタンの上に
> キチンと移動していますか?

Command1ボタンの◎の中心付近にあります。

> クリックしない との事ですが、なにで(どこで)確認しましたか?
> (Command1ボタンの上でクリックしないから、MsgBox が表示しないのでクリック
>  していないと判断していませんか?)

おっしゃる通り、MsgBox が表示しないのでクリックしてないと判断してます。
ひょっとして、どこか隠れた場所に表示されてるのでしょうか。

[ツリー表示へ]
タイトルRe^10: SendInput関数が Vistaで動作しないのですが?
記事No14064
投稿日: 2009/09/17(Thu) 20:16
投稿者花ちゃん
> Command1ボタンの◎の中心付近にあります。

だったら、試しに下記のように、DoEvents を追加して試してみて下さい。

    'Command1の真ん中にマウスポインタを移動
    Call SetCursorPos(x, y)
    
    DoEvents
    
    Dim MoEvents(1) As Integer

[ツリー表示へ]
タイトルRe^11: SendInput関数が Vistaで動作しないのですが?
記事No14065
投稿日: 2009/09/17(Thu) 20:39
投稿者
> だったら、試しに下記のように、DoEvents を追加して試してみて下さい。
>
>     'Command1の真ん中にマウスポインタを移動
>     Call SetCursorPos(x, y)
>    
>     DoEvents
>    
>     Dim MoEvents(1) As Integer

DoEvents を追加しましたが
Command1ボタンの ◎ のところで、マウスポインタは止まったままです。

このコードを参考に、ボタンを押すプログラムを書いたのですが、
やはり XPでは成功するのに、Vistaに持ってくるとだめなのです。
クリックした形跡が見られません。
それでサンプル集の 139 フォルダから、全く手を加えずに使用したわけです。

[ツリー表示へ]
タイトルRe^12: SendInput関数が Vistaで動作しないのですが?
記事No14066
投稿日: 2009/09/17(Thu) 21:12
投稿者
みなさまいろいろ教えてくれて、ありがとうございました。
解ったこと

他の人は、Vistaで正常動作だが、私のVistaでは一部動作がおかしい。

タイトルバーをダブルクリック
タイトルバーを右クリックはできるが
他のボタンを押す、左クリックだけが出来ない。
SendInputは動いてるみたい?

しばらくは XP機で我慢して使ってみます。

[ツリー表示へ]
タイトルRe^12: SendInput関数が Vistaで動作しないのですが?
記事No14067
投稿日: 2009/09/17(Thu) 21:23
投稿者花ちゃん
> DoEvents を追加しましたが
> Command1ボタンの ◎ のところで、マウスポインタは止まったままです。

Command2 ボタン をクリックした時に、Command1 ボタン は変化ありませんか?

sMouseEventSet プロシージャ内に
            mouseevent.dwFlags = MoEvents(Count)    'マウスイベント
            Debug.Print MoEvents(Count)

上記の Debug.Print MoEvents(Count) を追加して実行したら、結果はどうなりますか?

ひょっとして、Command2 ボタンをクリックした後、マウスをすぐに移動していませんか?

[ツリー表示へ]
タイトルRe^13: SendInput関数が Vistaで動作しないのですが?
記事No14068
投稿日: 2009/09/17(Thu) 21:42
投稿者

> Command2 ボタン をクリックした時に、Command1 ボタン は変化ありませんか?

Command1ボタンの ◎ のところに、マウスポインタは移動します。
その後は何も起りません。

>
> sMouseEventSet プロシージャ内に
>             mouseevent.dwFlags = MoEvents(Count)    'マウスイベント
>             Debug.Print MoEvents(Count)

結果
2
4
ダブルクリックだと
2
4
2
4
右クリック
8
16
です。

[ツリー表示へ]
タイトルRe^14: SendInput関数が Vistaで動作しないのですが?
記事No14069
投稿日: 2009/09/17(Thu) 22:04
投稿者花ちゃん
タイトルバーは、ダブルクリックできているのですよね。

Command2_Click イベント内の下記の部分をダブルクリックに書き換えて試して
見てもメッセージバックスは表示しないでしょうか?

'    Dim MoEvents(1) As Integer
'    Dim Xpos(1)     As Long     '0 だから設定は必要ないが宣言は必要
'    Dim Ypos(1)     As Long     '0 だから設定は必要ないが宣言は必要
'    MoEvents(0) = MOUSEEVENTF_LEFTDOWN              'マウスの左ボタンを押す
'    MoEvents(1) = MOUSEEVENTF_LEFTUP                'マウスの左ボタンを離す
'    Call sMouseEventSet(2, MoEvents, Xpos, Ypos)    'マウスイベントの実行
    
    Dim MoEvents(3) As Integer
    Dim Xpos(3)     As Long     '0 だから設定は必要ないが宣言は必要
    Dim Ypos(3)     As Long     '0 だから設定は必要ないが宣言は必要
    MoEvents(0) = MOUSEEVENTF_LEFTDOWN              'マウスの左ボタンを押す
    MoEvents(1) = MOUSEEVENTF_LEFTUP                'マウスの左ボタンを離す
    MoEvents(2) = MOUSEEVENTF_LEFTDOWN              'マウスの左ボタンを押す
    MoEvents(3) = MOUSEEVENTF_LEFTUP                'マウスの左ボタンを離す
    Call sMouseEventSet(4, MoEvents, Xpos, Ypos)    'マウスイベントの実行

[ツリー表示へ]
タイトルRe^15: SendInput関数が Vistaで動作しないのですが?
記事No14070
投稿日: 2009/09/17(Thu) 22:20
投稿者
> タイトルバーは、ダブルクリックできているのですよね。
>    
>     Dim MoEvents(3) As Integer
>     Dim Xpos(3)     As Long     '0 だから設定は必要ないが宣言は必要
>     Dim Ypos(3)     As Long     '0 だから設定は必要ないが宣言は必要
>     MoEvents(0) = MOUSEEVENTF_LEFTDOWN              'マウスの左ボタンを押す
>     MoEvents(1) = MOUSEEVENTF_LEFTUP                'マウスの左ボタンを離す
>     MoEvents(2) = MOUSEEVENTF_LEFTDOWN              'マウスの左ボタンを押す
>     MoEvents(3) = MOUSEEVENTF_LEFTUP                'マウスの左ボタンを離す
>     Call sMouseEventSet(4, MoEvents, Xpos, Ypos)    'マウスイベントの実行

やってみましたが、前と全く変わらぬ動作です。

タイトルバーをダブルクリック
タイトルバーを右クリックはOKなのになぜ?って思いますよねー。

追記
ひょっとして、Command2 ボタンをクリックした後、マウスをすぐに移動していませんか?
クリックした場所から移動してません。

[ツリー表示へ]
タイトルRe^16: SendInput関数が Vistaで動作しないのですが?
記事No14071
投稿日: 2009/09/17(Thu) 22:49
投稿者花ちゃん
Command1 ボタンを直接クリックしたらメッセージボックスは表示されますよね。

マウスカーソルがCommand1 ボタン上に移動してから、マウスダウン と マウスアップの
動作を実行したら、クリックできるはずですので、個別に確認した場合は、OK の
ようなので一度下記のように確実にマウスが移動してからクリック動作が実行されるように
下記のように待ち時間を作って試して見て下さい。

    y = y \ Screen.TwipsPerPixelX   'スクリーン座標に変換(通常=15)
    'Command1の真ん中にマウスポインタを移動
    Call SetCursorPos(x, y)
    
    Dim lngSt As Long
    lngSt = Timer
    Do While Timer - lngSt < 2
        DoEvents
    Loop
    Beep
    
    Dim MoEvents(1) As Integer


[ツリー表示へ]
タイトルRe^17: SendInput関数が Vistaで動作しないのですが?
記事No14072
投稿日: 2009/09/17(Thu) 23:05
投稿者

> 下記のように待ち時間を作って試して見て下さい。
>
>     y = y \ Screen.TwipsPerPixelX   'スクリーン座標に変換(通常=15)
>     'Command1の真ん中にマウスポインタを移動
>     Call SetCursorPos(x, y)
>    
>     Dim lngSt As Long
>     lngSt = Timer
>     Do While Timer - lngSt < 2
>         DoEvents
>     Loop
>     Beep
>    
>     Dim MoEvents(1) As Integer

> Command1 ボタンを直接クリックしたらメッセージボックスは表示されますよね。
直接クリックすれば表示されます。

>待ち時間を作って試して見て下さい。
これでも結果は同じでした。

遅くまでお付き合いいただき、ありがとうございました。
思いもかけぬところに原因があるのかな?とか考えています。

[ツリー表示へ]
タイトルRe: SendInput関数が Vistaで動作しないのですが?
記事No14043
投稿日: 2009/09/17(Thu) 11:02
投稿者花ちゃん
> (サンプル 139 マウスを指定場所に移動しクリックする。)
> 上記をサンプルで exeを作成したのですが、Vistaで実行できません。
> XP搭載のPCでは、問題なく動作するのですが、
> Vistaではクリックの動作をしないようです。

確認してみましたが、IDE上でも、EXE にしても一応動作します。

Command1_Click のコードも動作しないのでしょうか?
IDE 上でも動作しませんか?

VB6.0(SP6) Windows Vista/HP SP1

[ツリー表示へ]
タイトルRe^2: SendInput関数が Vistaで動作しないのですが?
記事No14045
投稿日: 2009/09/17(Thu) 11:23
投稿者
> 確認してみましたが、IDE上でも、EXE にしても一応動作します。
>
> Command1_Click のコードも動作しないのでしょうか?
> IDE 上でも動作しませんか?

開発環境からも、EXEにしてもだめです。

初めての質問なんで、記載漏れが多くごめんなさい。
環境は
VB6.0(SP6) Windows Vista/Ultimate

プロセスの実行権限を勉強してみます。

[ツリー表示へ]
タイトルRe^2: SendInput関数が Vistaで動作しないのですが?
記事No14047
投稿日: 2009/09/17(Thu) 12:31
投稿者オショウ
> 確認してみましたが、IDE上でも、EXE にしても一応動作します。

  VISTAにVB6環境を入れてあったので、再度確認しました。

  問題なく、統合環境でも単体EXEでも動作しました。

  管理者権限も付けてませんし、特別な設定もしませんでしたが
  正常動作したと思われます。

  さて、何が原因でしょうか・・・
  過去にいろいろな設定変更(OSやレジストリ)されてませんか?

以上。

[ツリー表示へ]
タイトルRe^3: SendInput関数が Vistaで動作しないのですが?
記事No14049
投稿日: 2009/09/17(Thu) 13:04
投稿者
>
>   さて、何が原因でしょうか・・・
>   過去にいろいろな設定変更(OSやレジストリ)されてませんか?
>
設定変更は、あまりやってません。
特にレジストリはいじってません。
VB6で作成した、ほかの自作プログラムは(10個ぐらいは)、
問題なく動作してます。
SendInputを使用したものだけが、動かないのです。困った。

[ツリー表示へ]
タイトルRe^2: SendInput関数が Vistaで動作しないのですが?
記事No14051
投稿日: 2009/09/17(Thu) 13:40
投稿者
花ちゃん様
見落としてました
> Command1_Click のコードも動作しないのでしょうか?
Private Sub Command1_Click()
  MsgBox "Commandボタンがクリックされました"
End Sub

ここは正常に作動します。

[ツリー表示へ]
タイトルRe^3: SendInput関数が Vistaで動作しないのですが?
記事No14059
投稿日: 2009/09/17(Thu) 18:00
投稿者花ちゃん
> 花ちゃん様
> 見落としてました
> > Command1_Click のコードも動作しないのでしょうか?
> Private Sub Command1_Click()
>   MsgBox "Commandボタンがクリックされました"
> End Sub
>
> ここは正常に作動します。

そのようになるのなら、SendInput関数は正常に動作しております。

ただ、マウスの移動位置が狂っているからと思います。

試しに下記のように、100 づつ足して見て下さい。

    y = (Form1.Top + 200) \ Screen.TwipsPerPixelX
    x = (Form1.Left + 1100) \ Screen.TwipsPerPixelX

他の同様の部分も。

[ツリー表示へ]
タイトルRe: SendInput関数が Vistaで動作しないのですが?
記事No14084
投稿日: 2009/09/18(Fri) 15:50
投稿者YK
> SendInput関数が Vistaで動作しないのですが?
> (サンプル 139 マウスを指定場所に移動しクリックする。)
> 上記をサンプルで exeを作成したのですが、Vistaで実行できません。
> XP搭載のPCでは、問題なく動作するのですが、
> Vistaではクリックの動作をしないようです。
> 解決方法があるのでしょうか?

こんにちは。
とりあえずVistaで動いたコードです。139を利用しています。
Option Explicit

'マウスを指定場所に移動しクリックする (139)
'         Option Explicit     'SampleNo=139 WindowsXP VB6.0(SP5) 2002.05.11
'マウスカーソルの位置を設定する(P389)
Private Declare Function SetCursorPos Lib "user32" _
    (ByVal x As Long, ByVal y As Long) As Long
'現在のマウスカーソルの位置座標を取得する(P387)
Private Declare Function GetCursorPos Lib "user32" _
    (lpPoint As POINTAPI) As Long
'位置座標を受け取る構造体
Private Type POINTAPI
        x As Long
        y As Long
End Type
'===============================================================
Private Type KEYBDINPUT
      wVk As Integer
      wScan As Integer
      dwFlags As Long
      time As Long
      dwExtraInfo As Long
End Type

Private Type INPUT_TYPE
      dwType As Long
      xi(0 To 23) As Byte
End Type

Private Type MOUSEINPUT
      dx As Long
      dy As Long
      mouseData As Long
      dwFlags As Long
      time As Long
      dwExtraInfo As Long
End Type

Private Declare Function SendInput Lib "user32.dll" _
    (ByVal nInputs As Long, pInputs As INPUT_TYPE, _
     ByVal cbsize As Long) As Long
'メモリブロックをコピーする(P1008)
Private Declare Sub CopyMemory Lib "kernel32.dll" _
    Alias "RtlMoveMemory" (Destination As Any, Source As Any, _
    ByVal Length As Long)

Private Const INPUT_KEYBOARD = 1
Private Const INPUT_MOUSE = 0

Private Const MOUSE_MOVED = &H1
Private Const MOUSEEVENTF_ABSOLUTE = &H8000& ' absolute move
Private Const MOUSEEVENTF_XDOWN = &H100
Private Const MOUSEEVENTF_XUP = &H200
Private Const MOUSEEVENTF_WHEEL = &H80
Private Const MOUSEEVENTF_LEFTUP = &H4      '左ボタンUP
Private Const MOUSEEVENTF_LEFTDOWN = &H2    '左ボタンDown
Private Const MOUSEEVENTF_MIDDLEDOWN = &H20 '中央ボタンDown
Private Const MOUSEEVENTF_MIDDLEUP = &H40   '中央ボタンUP
Private Const MOUSEEVENTF_RIGHTDOWN = &H8   '右ボタンDown
Private Const MOUSEEVENTF_RIGHTUP = &H10    '右ボタンUP
'システムを立ち上げてからの経過時間を高精度に取得する(P1002)
Private Declare Function GetSystemMetrics Lib "user32" _
                           (ByVal nIndex As Long) As Long
Private Const SM_CYCAPTION = 4       'TitleBar Height
Private Const SM_CXFRAME = 32
Private Const SM_CXSIZEFRAME = SM_CXFRAME
Private Const SM_CYFRAME = 33
Private Const SM_CYSIZEFRAME = SM_CYFRAME

Private Declare Function timeGetTime Lib "winmm.dll" () As Long


Private Sub Command1_Click()
    MsgBox "Commandボタンがクリックされました"
End Sub


Private Sub Command2_Click()
'Command1ボタンをクリック
    Dim x As Long
    Dim y As Long
    
    'Command1のボタンの真ん中の位置を求める
    '横方向
    x = Form1.Left + Command1.Left + (Command1.Width \ 2)
    'フォームの枠の寸法を求める      ↓
    x = (x \ Screen.TwipsPerPixelX) + GetSystemMetrics(32)
    
    '縦方向
    y = Form1.Top + Command1.Top + (Command1.Height \ 2)
    'タイトルバーの寸法を求める       ↓
    y = y \ Screen.TwipsPerPixelY + GetSystemMetrics(4)
    'Command1の真ん中にマウスポインタを移動
    Call SetCursorPos(x, y)

    Dim MoEvents(1) As Integer
    Dim Xpos(1)     As Long     '0 だから設定は必要ないが宣言は必要
    Dim Ypos(1)     As Long     '0 だから設定は必要ないが宣言は必要
    MoEvents(0) = MOUSEEVENTF_LEFTDOWN              'マウスの左ボタンを押す
    MoEvents(1) = MOUSEEVENTF_LEFTUP                'マウスの左ボタンを離す
    Call sMouseEventSet(2, MoEvents, Xpos, Ypos)    'マウスイベントの実行
End Sub


Private Sub Command3_Click()
'フォームのドラッグの自動化
    Dim x As Long
    Dim y As Long
    y = (Form1.Top \ Screen.TwipsPerPixelY) + GetSystemMetrics(4) / 2
    x = (Form1.Left + Form1.Width / 2) \ Screen.TwipsPerPixelX
    Call SetCursorPos(x, y)

    Dim MoEvents(2) As Integer
    Dim Xpos(2)     As Long
    Dim Ypos(2)     As Long
    MoEvents(0) = MOUSEEVENTF_LEFTDOWN              'マウスの左ボタンを押す
    Xpos(1) = 100: Ypos(1) = 100                    'マウスの移動量
    MoEvents(1) = MOUSE_MOVED                       'マウスの移動
    MoEvents(2) = MOUSEEVENTF_LEFTUP                'マウスの左ボタンを離す
    Call sMouseEventSet(3, MoEvents, Xpos, Ypos)    'マウスイベントの実行
End Sub


Private Sub Command4_Click()
'タイトルバーをダブルクリック
    Dim x As Long
    Dim y As Long
'    y = (Form1.Top + 100) \ Screen.TwipsPerPixelX
    y = (Form1.Top \ Screen.TwipsPerPixelY) + GetSystemMetrics(4) / 2
    x = (Form1.Left + Form1.Width / 2) \ Screen.TwipsPerPixelX
    Debug.Print x, y
    Call SetCursorPos(x, y)
    
    Dim MoEvents(3) As Integer
    Dim Xpos(3)     As Long     '0 だから設定は必要ないが宣言は必要
    Dim Ypos(3)     As Long     '0 だから設定は必要ないが宣言は必要
    MoEvents(0) = MOUSEEVENTF_LEFTDOWN              'マウスの左ボタンを押す
    MoEvents(1) = MOUSEEVENTF_LEFTUP                'マウスの左ボタンを離す
    MoEvents(2) = MOUSEEVENTF_LEFTDOWN              'マウスの左ボタンを押す
    MoEvents(3) = MOUSEEVENTF_LEFTUP                'マウスの左ボタンを離す
    Call sMouseEventSet(4, MoEvents, Xpos, Ypos)    'マウスイベントの実行
End Sub


Private Sub Command5_Click()
'タイトルバーを右クリック
    Dim x As Long
    Dim y As Long
    y = (Form1.Top \ Screen.TwipsPerPixelY) + GetSystemMetrics(4) / 2
    x = (Form1.Left + Form1.Width / 2) \ Screen.TwipsPerPixelX
    Call SetCursorPos(x, y)

    Dim MoEvents(1) As Integer
    Dim Xpos(1)     As Long     '0 だから設定は必要ないが宣言は必要
    Dim Ypos(1)     As Long     '0 だから設定は必要ないが宣言は必要
    Exit Sub
    MoEvents(0) = MOUSEEVENTF_RIGHTDOWN             'マウスの右ボタンを押す
    MoEvents(1) = MOUSEEVENTF_RIGHTUP               'マウスの右ボタンを離す
    Call sMouseEventSet(2, MoEvents, Xpos, Ypos)    'マウスイベントの実行
End Sub


Private Sub Form_Load()
    Form1.Move 0, 0
End Sub


Private Sub Timer1_Timer()
'現在のマウスポインタの座標を取得
    Dim MoP As POINTAPI        '現在のマウスポインタの位置座標
    Call GetCursorPos(MoP)
    Label1.Caption = "現在のマウス座標 X=" & MoP.x & " Y=" & MoP.y
End Sub


Private Sub sMouseEventSet(nInput As Long, MoEvents() As Integer, _
                                        Xpos() As Long, Ypos() As Long)
    Dim inputevents() As INPUT_TYPE
    Dim mouseevent As MOUSEINPUT
    Dim Count As Integer
    ReDim inputevents(nInput - 1) As INPUT_TYPE
    For Count = 0 To nInput - 1
        With mouseevent
            mouseevent.dx = Xpos(Count)             '水平方向の移動量
            mouseevent.dy = Ypos(Count)             '垂直方向の移動量
            mouseevent.mouseData = 0                '必要としません
            mouseevent.dwFlags = MoEvents(Count)    'マウスイベント
            mouseevent.time = 0                     'デフォルトの設定
            mouseevent.dwExtraInfo = 0              '必要としません
        End With
        inputevents(Count).dwType = INPUT_MOUSE
        CopyMemory inputevents(Count).xi(0), mouseevent, Len(mouseevent)
    Next Count
    Call SendInput(nInput, inputevents(0), Len(inputevents(0)))
End Sub

[ツリー表示へ]
タイトルRe^2: SendInput関数が Vistaで動作しないのですが?
記事No14086
投稿日: 2009/09/18(Fri) 17:02
投稿者
>     'フォームの枠の寸法を求める      ↓
>     x = (x \ Screen.TwipsPerPixelX) + GetSystemMetrics(32)
>    
>     '縦方向
>     y = Form1.Top + Command1.Top + (Command1.Height \ 2)
>     'タイトルバーの寸法を求める       ↓
>     y = y \ Screen.TwipsPerPixelY + GetSystemMetrics(4)

情報ありがとうございます。
GetSystemMetricsですか。

どうも私の場合は、うまくいかないようです。

[ツリー表示へ]
タイトルRe^3: SendInput関数が Vistaで動作しないのですが?
記事No14091
投稿日: 2009/09/19(Sat) 15:17
投稿者オショウ
間接的情報ですが・・・

ATIのビデオアダプタの場合は、いろいろ問題があるようです。
もしATIのビデオアダプタ使用されていたら、ドライバーの更新を
してみたら如何でしょう・・・

違うビデオアダプタでも、可能性はゼロではないかも・・・

以上。参考まで

[ツリー表示へ]
タイトルRe^3: SendInput関数が Vistaで動作しないのですが?
記事No14093
投稿日: 2009/09/19(Sat) 15:33
投稿者花ちゃん
> >     y = y \ Screen.TwipsPerPixelY + GetSystemMetrics(4)
> どうも私の場合は、うまくいかないようです。

上記の場合メニューバーの高さを考慮されていないので、メニューが付いている場合は
Form をクリックする事になります。

※ マウスとマウスドライバーを違う物にして試してみる必要もあるかと。
それと念の為、マウス位置をタイマーを使って表示している部分をコメントに
しておいて下さい。

[ツリー表示へ]
タイトルRe^4: SendInput関数が Vistaで動作しないのですが?
記事No14094
投稿日: 2009/09/19(Sat) 16:14
投稿者魔界の仮面弁士
> 上記の場合メニューバーの高さを考慮されていないので、メニューが付いている場合は
> Form をクリックする事になります。

スレッドが長くなってきたので、話を追いきれていないのですが、

>> ただ、私が本当に欲しい、
>> Private Sub Command2_Click()
>>    'Command1ボタンをクリック
>> End Sub
>> だけはだめでした。残念。

だけが目的であれば、
  Private Sub Command2_Click()
    Command1.Value = True
  End Sub
と書けるかと思います。マウス操作という本題からは外れますけれども。


また、マウス座標の移動先という点については、フォーム内の Left / Top 等から
算出するのではなく、API でデスクトップ座標を得るようにしてみては如何でしょうか。
(その方が、Frame 等の上に配置されていたりした場合にも対応しやすいですし)


Option Explicit
Private Type RECT
   x1 As Long
   y1 As Long
   x2 As Long
   y2 As Long
End Type
Private Type POINTAPI
   x As Long
   y As Long
End Type
Private Declare Function GetWindowRect Lib "user32" ( _
    ByVal hwnd As Long, ByRef rectangle As RECT) As Long
Private Declare Function SetCursorPos Lib "user32" _
    (ByVal x As Long, ByVal y As Long) As Long
Private Function GetBound(ByVal btn As VB.CommandButton) As RECT
    GetWindowRect btn.hwnd, GetBound
End Function
Private Function GetCenterLocation(ByVal btn As VB.CommandButton) As POINTAPI
    With GetBound(btn)
        GetCenterLocation.x = (.x1 + .x2) \ 2
        GetCenterLocation.y = (.y1 + .y2) \ 2
    End With
End Function

Private Sub Command2_Click()
    With GetCenterLocation(Command1)
        SetCursorPos .x, .y
    End With
End Sub


なお、クリックすることが目的ではなく、クリック時の動作を呼び出す事が
目的なのであれば、IAccessible.accDoDefaultAction を使うという選択肢もあります。

'参照設定 oleacc.dll
Option Explicit

Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
    (ByVal hWnd As Long, ByVal dwObjectID As Long, _
     ByRef riid As Currency, ByRef ppvObject As Any) As Long

Private Sub ButtonClick(ByVal targetButton As VB.CommandButton)
    Dim IID_IAccessible(1) As Currency  '{618736E0-3C3D-11CF-810C-00AA00389B71}
    IID_IAccessible(0) = 128331065315080.368@
    IID_IAccessible(1) = 818619832317929.3825@
    Const OBJID_CLIENT As Long = &HFFFFFFFC
    Dim objAcc As IAccessible
    Dim r As Long
    r = AccessibleObjectFromWindow(targetButton.hWnd, OBJID_CLIENT, IID_IAccessible(0), objAcc)
    If r = 0 Then
        objAcc.accDoDefaultAction
    Else
        Err.Raise r
    End If
End Sub

Private Sub Command2_Click()
    ButtonClick Command1
End Sub

[ツリー表示へ]
タイトルRe^5: SendInput関数が Vistaで動作しないのですが?
記事No14095
投稿日: 2009/09/19(Sat) 20:08
投稿者
みなさんに、いろいろ助言を受けいろいろ試してまいりましたが、
実は違うところに、原因がありました。
Vistaの新機能で(?)DPIをでデフォルトが96 DPIのところを120 DPIに設定していたようです。
これについては、導入直後にやったのだと思いますが、完全に忘れていました。

PCのデフォルトは96dpiですので、Pixel = Twips \ (1440/解像度)  1440/96=15
Pixel = Twips \ 15
y = y \ Screen.TwipsPerPixelX   'スクリーン座標に変換(通常=15)

ところが、わたしのPCは120dpiになっていましたので 1440/120=12
y = y \ 12 でなければならなかったのです。
Screen.TwipsPerPixelX は120dpiに変更したVista上でも その値は15になってしまいますので、
これを   y = y \ 12 に変更して、正常に動作するようになりました。
SendInputではなく、SetCursorPos(x, y)に問題があったわけです。

大変お騒がせし、申し訳ありませんでした。
またその後の調べで、Vistaでは EXEのプロパティの互換性に、
高 DPI 設定では画面のスケーリングを無効にする というのが追加されていて、
そこにチェックを入れておけば、上記のような面倒なことをしなくても、
よい事が確認できました。

なぜ SendInput にこだわったのかと言いますと、
flashで作られたサイトのボタンを、押す必要があったからです。
htmlだけのサイトであれば、別の方法を使用したのですが、フラッシュの場合、
POSTするとか、ハンドルを取ってメッセージを送るとかのやり方が全く解らず、
それじゃ、場所決めしてボタンを押そうかと、思ったからです。

うまいやり方をご存知の方は、ぜひ教えてください。

何とか目的は達成できました。
いろいろとありがとうございました。

[ツリー表示へ]
タイトルRe^6: SendInput関数が Vistaで動作しないのですが?
記事No14096
投稿日: 2009/09/19(Sat) 21:23
投稿者花ちゃん
> Screen.TwipsPerPixelX は120dpiに変更したVista上でも その値は15になってしまいま

変ですね、120dpi にすれば、Screen.TwipsPerPixelX (正しくは、Screen.TwipsPerPixelY)
は、12 になりますけどね。 XP 及び Vista 上で確認
(120dpi に設定しても同じコードで問題なく動作しますよ)

[ツリー表示へ]
タイトルRe^7: SendInput関数が Vistaで動作しないのですが?
記事No14097
投稿日: 2009/09/19(Sat) 21:57
投稿者

>
> 変ですね、120dpi にすれば、Screen.TwipsPerPixelX (正しくは、Screen.TwipsPerPixelY)
> は、12 になりますけどね。 XP 及び Vista 上で確認
> (120dpi に設定しても同じコードで問題なく動作しますよ)

そうですか?
再度確認しましたが、わたしのVista では15になります。

ま、もし 12 になってくれていれば、
不具合はおきなかったし、なにも気付かずに使用していたでしょうね。

XPでも120dpiできるんですか。どこでやるのかな?

わたしはここで変更したのだと思います
「コントロールパネル」「個人設定」「フォントサイズ(DPI)の調整」
大きなスケール(120 DPI)(L)-読みやすいテキスト をチェック。

[ツリー表示へ]
タイトルRe^8: SendInput関数が Vistaで動作しないのですが?
記事No14098
投稿日: 2009/09/19(Sat) 22:12
投稿者オショウ
> そうですか?
> 再度確認しましたが、わたしのVista では15になります。
>
> ま、もし 12 になってくれていれば、
> 不具合はおきなかったし、なにも気付かずに使用していたでしょうね。

  ATIなら・・・
  http://www.comachi.com/2006/01/ieati_mobility_radeon_x300.html

  こんな情報もありますので、異常値が返ってくるならば
  ビデオドライバーの問題でしょう

※ ATIでなくても、その辺疑ってみて下さい。

以上。参考まで

[ツリー表示へ]
タイトルRe^9: SendInput関数が Vistaで動作しないのですが?
記事No14100
投稿日: 2009/09/19(Sat) 22:48
投稿者
>   ATIなら・・・
>   http://www.comachi.com/2006/01/ieati_mobility_radeon_x300.html
>
>   こんな情報もありますので、異常値が返ってくるならば
>   ビデオドライバーの問題でしょう
>
> ※ ATIでなくても、その辺疑ってみて下さい。
>
あまりハードには関心がないのですが、調べてみたら
NVIDIA GeForce 8600 GT というのが入ってるみたいです。
2画面で使ってるのですが、19ワイドと 普通の19 
画面の大きさも違うのですが、その辺の影響もあるのでしょうか。

[ツリー表示へ]
タイトルRe^10: SendInput関数が Vistaで動作しないのですが?
記事No14101
投稿日: 2009/09/20(Sun) 00:02
投稿者オショウ
> NVIDIA GeForce 8600 GT というのが入ってるみたいです。
> 2画面で使ってるのですが、19ワイドと 普通の19 
> 画面の大きさも違うのですが、その辺の影響もあるのでしょうか。

  私のVISTAマシンには
  NVIDIA GeForce 9800 GTX+
  を使っており、2画面使用ですが・・・

  96DPI設定では問題なしです。

※ 120DPIに設定して動作させたことが無いので、
  異常があればまた報告させて頂きます!

以上。

[ツリー表示へ]
タイトルRe^11: SendInput関数が Vistaで動作しないのですが?
記事No14102
投稿日: 2009/09/20(Sun) 07:17
投稿者
>   96DPI設定では問題なしです。

わたしのPCも 96DPI設定にすると、問題はおきません。

前にも書きましたが、120DPIに設定であっても、SetCursorPos(x, y)を使ったものについては
EXEのプロパティの互換性で、高 DPI 設定では画面のスケーリングを無効にするに、
チェックを入れておけば、問題なさそうなので、一応解決とします。

Screen.TwipsPerPixelYが 15 になってしまうという疑問点は、残ったままですが、
これはわたし固有の問題で、ひょっとすると、他の設定との関連でこうなってしまうのかも。
後になってわかることかもしれませんが、これ以上のめり込むと、またハマってしまいますので。

追記
やや高齢なので(68)目にきています。120DPIを使う理由です。
XPの120DPIを前日使ってみましたが、これはチョット。さすがに遠慮させてもらいました。
Vistaとは趣が違います。

[ツリー表示へ]
タイトルRe^7: SendInput関数が Vistaで動作しないのですが?
記事No14099
投稿日: 2009/09/19(Sat) 22:28
投稿者
Screen.TwipsPerPixelY)
> は、12 になりますけどね。 XP 及び Vista 上で確認

XPは今確認しました。たしかに 12 になります。
Vista 15 何故??

[ツリー表示へ]