• 締切済み

C#でHTAを操作

「HTAを起動し、そのHTA上のアンカーリンクをクリックする。」という一連の操作を、プログラムで自動化したいと考えております。 現在、C#での実装を試みておりますが、HTAを起動することまではできるのですが、アンカーリンクをクリックすることが実現できておりません。 良い方法をご存じの方がいらっしゃいましたら、ご教示ほどよろしくお願いいたします。 ※既存のHTAを操作するので、HTAに手を加えることはできません。 ※C#ではなく、VBSなどでの実装方法でも構いません。

  • quwa
  • お礼率33% (1/3)

みんなの回答

  • kzr260v2
  • ベストアンサー率48% (786/1615)
回答No.1

HTAという、いわば外部のアプリに対して、クリックなどを送ることそのものが、あまりおすすめできない方向です。ブラウザで表示された画面の情報を取得し、メッセージを送信、これらを必要に応じて繰り返す泥臭い手続きになるからです。 具体的には、外部アプリを今回のようなやり方で操作するとしたら、ロードされたアプリの位置を取得し、想定されたアンカーリンクの位置に対してクリック送る方法や、TABキーでフォーカス移動して、Enterキーを送るなどの方法が考えられます。 アプリのロードが終了したかなどを、その都度解析するよう組むことが比較的良い方法ですが、よくあるのは単に待機時間を設定することです。しかし、マシンスペックや通信環境などで違いが出てもおかしくありませんから、待機時間だけでは、うまく動作しないことがあると思います。 ※ ターゲット(実行を想定した環境)によって、処理を切り替える必要があるかもしれないです。例えば、Windowsの8.1と10での違いなどです。 ※ メッセージを送るところについては、Googleなどで以下のキーワード検索が考えられます。 ブラウザ sendkeys ブラウザ sendmessage ※ Visual Basic6で、自身にロードしたページのリンクをクリックしたり、テキストボックス入力する、そんなsendするサンプルを見た記憶はありますが見つかりません。すみません。C#でもあるとは思いますが、それも見つかりません。すみません。 直接のご要望を満たすものではないですが、糸口にはなると思い、ご案内してみました。参考にならなかったらごめんなさい。

quwa
質問者

お礼

ご回答ありがとうございます。 キーイベントを送る方法だと、仰る通り待機時間での調整となってしまいますので、タイミングによっては正常に動作しないことがありました。このため、C#でIEを操作する方法と同じような方法で、HTAも操作できないかと思った次第でした。 VB6でのサンプルの件、私も探してみたいと思います。

関連するQ&A

  • HTAで、こんなボタンを作成したい。

    手順書にそってバッチファイルを実行しているのですが、やり忘れなどを防ぐ為 HTA+VBSで簡単な操作パネル的(ボタン型ランチャー?)なものを作ろうと思っていますが、 どう作成してよいのやら不明です。 イメージしているものは、 『(1)設定』ボタンを押下で、(1)バッチファイル実行 Msg:(1)バッチファイルが終了しましたか[OK]   Msgをクローズして →『(1)設定』ボタンの色を赤に変える※過程が分かるようにしたいため   で上記のようなボタンを15個ぐらい作成。 ※途中で再起動しても、進行過程が残るようにしたいと思うのですが、ご教授願えますでしょうか。  具体的なコードと簡単で構わないので解説して頂けましたらと思います。  以上、よろしくお願いいたします。

  • Ctrl+Cの動作をするvbs

    以下の操作を再現するvbsはどう書けばよいのでしょうか? 1.ファイル選択 2.Ctrl+Cを押す いろいろ試したのですが、うまくいきませんでした。 .NET等不要でvbsのみで実現できるはず、と思っているのですが無理でしょうか?

  • HTA 内へ埋め込んだスプレッドシートの操作

    HTA 内へ埋め込んだスプレッドシートの操作 いつもお世話になります 以下のサイトを参考に、Excel Sheetを埋め込んだHTML Applicationを開発しています。 http://www.microsoft.com/japan/technet/scriptcenter/topics/activex/spreadsheet.mspx コードは以下のとおりです。 このコードのGetProcessesを参考にして、テキストファイル(CSV,XMLなど)を読み込んで表示し、編集後に保存する方法はできるのですが、既存のexcelファイル(*xls)を読み込み表示、編集後に保存する方法がわかりません。 googleで検索して適当な例が見つかりませんでした。 excel VBAにお詳しい方のご教示をよろしくお願いします。 SpleadSheet.hta (または SpleadSheet.html -------------------------------------------------------------------------- <html> <head> <title>Spreadsheet Example</title> </head> <Script Language="VBScript"> Sub Window_Onload Spreadsheet1.TitleBar.Caption = "Process Information" End Sub Sub GetProcesses strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colProcesses = objWMIService.ExecQuery("Select * From Win32_Process") i = 1 For Each objProcess in colProcesses strCell = "A" & i Spreadsheet1.Range(strCell).Cells(1) = objProcess.Name strCell = "B" & i Spreadsheet1.Range(strCell).Cells(1) = objProcess.WorkingSetSize strCell = "C" & i Spreadsheet1.Range(strCell).Cells(1) = objProcess.HandleCount i = i + 1 Next End Sub </script> <body bgcolor="buttonface"> <br> <object classid="clsid:0002E559-0000-0000-C000-000000000046" id="Spreadsheet1"> <param name="DisplayToolbar" value="0"> <param name="DisplayWorkbookTabs" value="0"> <param name="DisplayTitleBar" value="-1"> </object> <p><input type="button" value="Get Process Information" onclick="GetProcesses"> </body> </html> --------------------------------------------------------------------------

  • HTA上データをExcelへ転記するには?

    HTAでレコードを条件検索するプログラムを作っています。条件によるレコード検索までは出来ているのですが、その結果の転記が出来ないでおります。 検索を実行すると指定した条件でDBの情報を取得し表示させます。 表示する際にHTA上にレコードの横へチェックボックスが作成されます。 HTA上に表示されるレコードですが、レコードの状態を確認するため必要最低限のものしか表示しないようにしています。 (ウィンドウサイズを出来るだけ小さく作りたかったため) select * from sheet1 where 陳列コード = 'B01'で検索を行いobjRS(1)、objRS(2)、objRS(3)、objRS(6)、objRS(7)というように全てのフィールドは表示させていません。 HTA上に表示をしExcelへ転記する必要があるものだけを確認したらチェックボックスにチェックをいれます。 転記を押したらHTA上に表示されている「商品C (objRS(2))」と「陳列C (objRS(3))」のフィールドをを元に再度SQLを発行させExcelに転記するというやり方です。 例:select * from sheet1 where 商品コード = 'A0001' and 陳列コード 'B1'のようにです。 要は、チェックボックスにチェックがついたものだけをSQLを発行しエクセルへ転記を行いたいのですがどのようにしたらいいのか・・・ ひょっとしたらHTAのオブジェクトを取得してHTA自分自身を操作??なんておもってやってみたのですが何故かHTAのプログラムだけ結果が返りません。 それかこの考え自体が間違いでしょうか?どなたかヒントで構いませんので力になっていただけないでしょうか? http://www.google.com/notebook/public/06577523275749879902/BDRomDAoQ8pekyuwj?hl=ja (似たような質問を昼間書いたのですが自分自身分かりづらかったので再投稿しました 削除が可能になりましたら古いのは消しますのでご了承ください)

  • 【VBScript】VBSでOpenOfficeを操作したい

    【VBScript】VBSでOpenOfficeを操作したい VBSでOpenOfficeを操作できますか? 以下のページでVBSでExcelを操作する方法が記載されていますが、 ExcelではなくOpenOfficeがインストールされている環境では どのように実現できるのでしょうか?他の言語ではできる? ヒントでも良いので教えて下さい。 www.happy2-island.com/vbs/cafe02/capter00401.shtml

  • C# タスクスケジューラ操作について

    お世話になります。 Windows7Pro VisualStudio2005C# で業務アプリケーションを開発しております。 C#のコードでタスクスケジューラの操作を考えております。 現状コマンドプロンプトを起動し、命令文を実行する方法で考えております。 目的としましては、既に作成してあるタスクに対して、 C#のコードから実施時刻、使用有無、実行間隔を変更したいと考えております。 しかしながら、以下の命令文で実施時刻、使用有無は変更できますが、実行間隔が操作できません。 SCHTASKS /CHANGE /RU ********* /RP ***** /TN TEST /ST 17:30 /ENABLE 変更のコマンドがご存知の方がございましたら、ご教示いただければ幸いに存じます。 また、本稿C#のカテゴリに投稿した理由としまして、 C#2005で本処理を含むタスクスケジューラを操作するコードがございましたら、 ご教示いただければと思いまして記述を致しました。 合わせてご教示いただければ幸いに存じます。 以上宜しくお願い申し上げます。

  • フォルダの物が増えたら、自動的にHTMLリンク化

    お世話になっております。 こんなことできるのか? ということで質問させていただきます。 現在、VBAで色々組むことが多く、 良く使いそうなものはメモ帳にテーマ毎に書き溜めてあります。 見るにしても、いちいち探し、 ダブルクリックしなればならないのが少し面倒。 そこで、同じフォルダにあるものが増えたら、 自動的にHTMLにメモ帳のタイトル、リンクを最終行に追加できないかと 思い、質問させていただきました! 毎日、同じ名前で1から作り直すという方法でも良いです。 やはり、VBSかなんかでプログラムを組んで、 その日更新されていなければ、1から作り直す…というのがベターなのでしょうか? かといって、まだプログラムは全然取り組んでませんが… こういったことを実現するソフトはないかと思いますが、 何か良い方法があれば教えて下さい! よろしくお願い致します。

  • jqueryでのhtmlタグの操作

    jqueryでのhtmlタグの操作 いつもお世話になっております。 jqueryでhtmlタグを操作したいのですが 実装方法がわかりません。狙いとしては画面遷移処理を はさみたくないのが目的です。 具体的な実装は添付ファイルの通りです。 お手数ですが添付ファイルをご覧になり 御教示頂けたらと思います。

  • C++とC#を使ったアプリケーション作成

    アプリケーションと言って良いのかは微妙なのですが、アプリケーションを作ることになりました。 既存のいくつかのプログラムを1つにまとめて、GUIで操作できるようにするのが最終目的です。 もとのプログラムはC++で書かれています。 今回は、GUIの部分を 「Microsoft Expression Blend 2」でデザインしようと考えているのですが、 GUIの部分をC#で作成し、メインの処理をC++で書くことは可能なのでしょうか? それとも、メインの処理をC#で書き直すことが必要でしょうか? 知恵を貸してください。 よろしくお願いします!!

  • ファイルパス操作について

    いつもお世話になっております。 今回はパス操作についてお聞きしたいことが有ります。 例えば C:\hoge1\hoge2\hoge3\hoge.txt のようなパスが合ったとして、ファイル名を取りたいときは ::PathRemoveFileSpecで可能ですが、 C:\hoge1まで切り出したいとき、 現在上記APIを3度呼んで実装しています。 char sz = {"C:\hoge1\hoge2\hoge3\hoge.txt"}; ::PathRemoveFileSpec(sz); ::PathRemoveFileSpec(sz); ::PathRemoveFileSpec(sz); これでsz=C:\hoge1になる このような感じで実現は出来るのですが、スマートでは無いと感じております。 もっといい方法がありましたら教えてください。 よろしくお願いします。 環境は window7 professional visual studio 2008 MFC未使用です。

専門家に質問してみよう