アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。質問させていただきます。
画面上に テキストファイルと電卓、エクセルファイルが起動しているときに
任意のWindowを取得することはできるのでしょうか?
やりたいことは、任意のウインドウが表示されていれば、処理Aをおこなう
表示されていなければ、なにもしないということです。
(画面上に a.txt 電卓 c.xlsがたちあがっているときにa.txtのウインドウを
取得し処理を実施したい)
宜しくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    こんにちは。
    今、このようにつくっており認証画面がでてなくてもでていいても
    とりあえずsendkyesが実行されます。 

    これを、もし 認証画面がPC内にひょうじされていれば
    sendkysで文字列を入力し、そうでなければなにもしない。というマクロをくみたいとおもってます。

    Sub dd()
    Set objShell = CreateObject("WScript.Shell")
    objWshShell.AppActivate "認証画面"
    sendkys ・・・・
    end sub
    以上 よろしくおねがいします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/03/15 14:44
  • うれしい

    ご回答ありがとうございます。
    >ただ、「認証画面」というものは、以下のようなものを指していませんか? いいえ違います
    ①SendMessageAPIを使う際も、このような呪文が必要になるのでしょうか?Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( ByVal lpClassName As String, ByVal lpWindowName As String) As Long ②この処理の意味について("Notepad", "A.TXT - メモ帳")をfindwindowの引数として lpClassNameと lpWindowName に渡しUSER32.DLLを使って処理し戻り値をhWndに格納しているのでしょうか? spyとかUwSCとかいろいろと勉強になりました。どうもです

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/03/16 02:26

A 回答 (3件)

こんにちは。



1>アクティブウインドウの取得
2>任意のウインドウが表示されていれば、処理Aをおこなう
3>画面上に a.txt 電卓 c.xlsがたちあがっているとき

それぞれ意味が違いますね。

その中で、3 を選びました。
ただ、ふつうは、
FindWindow("Notepad", "A.TXT - メモ帳")
はしないで、
FindWindow("Notepad", vbNullString)
としてしまいます。

'クラス名:"Notepad", "Windows.UI.Core.CoreWindow", "XLMAIN" (これは、電卓とedge の区別がない。)

'//
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
   ByVal lpClassName As String, _
   ByVal lpWindowName As String) As Long

Sub TestGETApp()
''a.txt 電卓 c.xls
Dim hWnd As Long
  hWnd = FindWindow("Notepad", "A.TXT - メモ帳")
  If hWnd <> 0& Then
   MsgBox "メモ帳は起動しています。", vbInformation
  Else
   MsgBox "メモ帳は起動していません。", vbExclamation
  End If
End Sub
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

2>任意のウインドウが表示されていれば、処理Aをおこなう をおしえてください。

たとえば、そのPC内に メーラなどの認証画面が表示されているときは、sendkysなどで文字(パスワード)をいれる 
表示されないときはなにもしないなどを実現させたいとおもってます。
よろしくお願いいたします。

お礼日時:2017/03/15 14:35

こんにちは。



>objWshShell.AppActivate "認証画面"
これは、FindWindowが、その役目をします。
>>任意のウインドウが表示されていれば、処理Aをおこなう をおしえてください。

FindWindowEx で特定の場所を指定します。

そして、そこに、SendyKeys の代わりに、SendMessageAPIで、文字を送るということです。

 Dim hWindow As Long

 hWindow = FindWindow(vbNullString, "無題 - メモ帳")
 if hWindow <> 0 then
  hWindow = FindWindowEx(hWindow, 0, "edit", vbNullString)
 End If
 If hWindow = 0 Then msgbox "エラー" :Exit Sub
次のステップ

その"edit" は、spy++などで取ります。

ところが、
>たとえば、そのPC内に メーラなどの認証画面が表示されているときは、>sendkysなどで文字(パスワード)をいれる 

ただ、認証画面のようなものは、FindWindowEx で取れないことも多いのです。
そこで、一般的には、UWSC のようなWindowマクロを使って行うことが多いです。

ただ、「認証画面」というものは、以下のようなものを指していませんか?
もし、そうですと、こういう方法とは全く違うことになります。
その場合は、ここのようなスタイルで行うことが可能です。
http://www.vba-ie.net/collection/iebasic.html
「VBA アクティブウインドウの取得につい」の回答画像2
この回答への補足あり
    • good
    • 0

こんにちは。


返事が遅くなりました。

>SendMessageAPIを使う際も、このような呪文が必要になるのでしょうか

以下のサンプルは、昔の電卓ですが、分かりやすいですね。
hWnd1 で、本体を取得して、次に、その親のハンドルから、ボタンの位置を割り出して、ハンドルを取り出して、SendMessage の引数にし、そこに、文字や動作を送るわけです。

  Sub Main()
    Dim hwnd1 As Integer, hwnd2 As Integer
    hwnd1 = FindWindow("SciCalc", "電卓")
    hwnd2 = FindWindowEx(hwnd1, 0, "Button", "5")

    SendMessage hwnd2, BM_CLICK, 0, 0
  End Sub
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!