C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: アクティブ状態のWindowのボタンを押す


(過去ログ 50 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■27152 / inTopicNo.1)  アクティブ状態のWindowのボタンを押す
  
□投稿者/ ごろ (1回)-(2008/10/29(Wed) 15:55:57)

分類:[VB.NET/VB2005 以降] 

2008/10/29(Wed) 16:57:43 編集(投稿者)
2008/10/29(Wed) 16:45:33 編集(投稿者)

.NET VB2005で、アクティブ状態となっている画面のボタンを押したいのですが、手法がわかりません。
.NET2005で不可能なら、VB6.0でもかまいません。
わかる方がいらしたら、教えて下さい。

引用返信 編集キー/
■27165 / inTopicNo.2)  Re[1]: アクティブ状態のWindowのボタンを押す
□投稿者/ やじゅ (731回)-(2008/10/29(Wed) 20:46:08)
やじゅ さんの Web サイト
No27152 (ごろ さん) に返信
> .NET VB2005で、アクティブ状態となっている画面のボタンを押したいのですが、手法がわかりません。

アクティブ状態なら普通にボタン押せませんかね? 

非アクティブ状態とかの間違いでしょうか・・・、それとも自動的にボタンを押したいのでしょうか

なんにしても、もう少し補足していただかないと意味が不明です。
引用返信 編集キー/
■27166 / inTopicNo.3)  Re[2]: アクティブ状態のWindowのボタンを押す
□投稿者/ 倉田 有大 (304回)-(2008/10/29(Wed) 21:00:08)
No27165 (やじゅ さん) に返信
> ■No27152 (ごろ さん) に返信
>>.NET VB2005で、アクティブ状態となっている画面のボタンを押したいのですが、手法がわかりません。
>
> アクティブ状態なら普通にボタン押せませんかね? 
>
> 非アクティブ状態とかの間違いでしょうか・・・、それとも自動的にボタンを押したいのでしょうか
>
> なんにしても、もう少し補足していただかないと意味が不明です。

ぬーん、エスパー回答・・しようと思ったが、全然おもいつかない〜
ごろさん、もう少し情報ください。
引用返信 編集キー/
■27169 / inTopicNo.4)  Re[1]: アクティブ状態のWindowのボタンを押す
□投稿者/ yukiyukki (1回)-(2008/10/29(Wed) 21:36:16)
うーん、同一プロジェクト内のアクティブボタンをクリックしたいという事ですかね?

例えば。。
Me.ActiveControl.PerformClick()
かな??

アクティブなコントロールがボタンであるかを調べる必要があると思いますが。。

引用返信 編集キー/
■27189 / inTopicNo.5)  Re[2]: アクティブ状態のWindowのボタンを押す
□投稿者/ ごろ (2回)-(2008/10/30(Thu) 09:30:06)
2008/10/30(Thu) 09:31:27 編集(投稿者)
2008/10/30(Thu) 09:30:34 編集(投稿者)

投稿者のみなさんへ
ありがとうございます。

また、情報不足ですみません。
アクティブ状態で表示されている画面の特定のボタンを、別のプログラムから自動的に押下したいのですが その手法がわかりません。以下の手法で、動作している画面の情報までは取得できました。

For Each p As Process In Process.GetProcesses()
 If Not p.MainWindowHandle.Equals(IntPtr.Zero) Then
   ListBox1.Items.Add(p.ProcessName & " : " & p.MainWindowTitle)
 End If
Next


引用返信 編集キー/
■27190 / inTopicNo.6)  Re[3]: アクティブ状態のWindowのボタンを押す
□投稿者/ たくボン (56回)-(2008/10/30(Thu) 09:41:19)
No27189 (ごろ さん) に返信
> アクティブ状態で表示されている画面の特定のボタンを、別のプログラムから自動的に押下したいのですが その手法がわかりません。以下の手法で、動作している画面の情報までは取得できました。

仕事中なので、詳細には書けませんが現在アクティブ状態になっている画面の取得には、APIのGetActiveWindow()を使うとハンドルが取れます。
ただし、別プロセスで定期的にGetActiveWindowで監視するのもスマートじゃないですね。その辺何か通知のAPIってなかったかな?(ウロ覚えですいません)
引用返信 編集キー/
■27191 / inTopicNo.7)  Re[3]: アクティブ状態のWindowのボタンを押す
□投稿者/ みきぬ (188回)-(2008/10/30(Thu) 09:41:21)
要はこういうものがあればいいんですよね。
http://www.forest.impress.co.jp/article/2005/05/20/autoclicker.html

なんとなくVB(.NET)だけじゃだめな気がする。Win32APIかそこまではわからないけど。
引用返信 編集キー/
■27208 / inTopicNo.8)  Re[4]: アクティブ状態のWindowのボタンを押す
□投稿者/ やじゅ (735回)-(2008/10/30(Thu) 13:04:09)
やじゅ さんの Web サイト
「EnumChildWindows VB」で検索してみるとか
外部アプリのボタンのハンドルさえ取れれば、あとはどうにかなるんですよね。

引用返信 編集キー/
■27210 / inTopicNo.9)  Re[4]: アクティブ状態のWindowのボタンを押す
□投稿者/ ごろ (3回)-(2008/10/30(Thu) 13:22:05)

【たくボン】さんへ
 ありがとうございます。
 API関連をネットで検索して調べてみます。

【みきぬ】さんへ
 ありがとうございます。
 そうです。「Auto Clicker」みたいな感じのプログラムです。APIを探してみます。

【やじゅ】さんへ
 ありがとうございます。
 [EnumChildWindows VB]で検索してみます。
引用返信 編集キー/
■27213 / inTopicNo.10)  Re[5]: アクティブ状態のWindowのボタンを押す
□投稿者/ 魔界の仮面弁士 (885回)-(2008/10/30(Thu) 13:56:04)
No27210 (ごろ さん) に返信

ところで、その対象となるボタンはウィンドウ ハンドルを持っているのでしょうか?
一般的なボタンなら、アクティブ時に BM_CLICK を送りつけてやれば済むでしょうけれども、
非ウィンドウなボタンの場合(WebBrowser 上の HTML のボタンや、Excel UserForm 上のボタン等)は
hWnd を持たないので、IAccessible を利用できる場合には
AccessibleObject.DoDefaultAction()
IAccessible.accDefaultAction()
などを利用して押すとか、あるいはマウス操作をエミュレートするなどの対処が必要かも知れません。
引用返信 編集キー/
■27223 / inTopicNo.11)  Re[6]: アクティブ状態のWindowのボタンを押す
□投稿者/ たくボン (57回)-(2008/10/30(Thu) 16:30:49)
2008/10/30(Thu) 16:34:24 編集(投稿者)
No27213 (魔界の仮面弁士 さん) に返信
> ■No27210 (ごろ さん) に返信
> 
> ところで、その対象となるボタンはウィンドウ ハンドルを持っているのでしょうか?
> 一般的なボタンなら、アクティブ時に BM_CLICK を送りつけてやれば済むでしょうけれども、

あくまでハンドルを持っている前提でWM_ACTIVATEを捕まえるサブクラスを作ってみました(ただしVB6)
Atach()にアクティブ時に通知が欲しいWindowのハンドルを渡せばWindowProc()に飛んできます。
サブクラスを解除したい場合はDetach()を呼んで下さい。
一応戻り値では判断するようにしましたが、実際に運用するなら適切なエラー処理を入れてください。


Option Explicit

Public Const GWL_WNDPROC = (-4)
Public Const WM_ACTIVE As Long = &H6

Public Const WA_INACTIVE As Long = &H0
Public Const WA_ACTIVE As Long = &H1
Public Const WA_CLICKACTIVE As Long = &H2

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongW" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcW" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private lpDefProc As Long

Public Function Atach(hWnd As Long) As Boolean
    'サブクラス化
    lpDefProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
    If lpDefProc <> 0 Then
        Atach = True
        Exit Function
    End If
    Atach = False
End Function

Public Function Detach(hWnd As Long) As Boolean
    Dim ret As Long
    
    If lpDefProc <> 0 Then
        'サブクラス化の停止
        ret = SetWindowLong(hWnd, GWL_WNDPROC, lpDefProc)
        If ret <> 0 Then
            lpDefProc = 0
            Detach = True
            Exit Function
        End If
    End If
    Detach = False
End Function

Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case uMsg
        Case WM_ACTIVE
            Select Case wParam
            Case WA_INACTIVE
                Debug.Print "非Active化されました。"
            Case WA_ACTIVE
                Debug.Print "Active化されました。"
                'TODO ここで押下対象となるボタンへBM_CLICKを送る
            End Select
    End Select
    WindowProc = CallWindowProc(lpDefProc, hWnd, uMsg, wParam, lParam)
End Function


.NETでサブクラス化するならNativeWindowを継承だったかな。

引用返信 編集キー/
■27390 / inTopicNo.12)  Re[7]: アクティブ状態のWindowのボタンを押す
□投稿者/ ごろ (4回)-(2008/11/05(Wed) 11:31:15)
返信者のみなさんへ
回答ありがとうございました。

フリーの[Auto Clicker]を使う事にしました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -