アクセスカウンタ

プロフィール

Author:croissant3

カテゴリー

最近の記事

月別アーカイブ(タブ)

最近のコメント

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

月別アーカイブ

カレンダー

11 | 2016/12 | 01
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

小さな天気予報


-天気予報コム- -FC2-

全ての記事を表示する

全ての記事を表示する

PCノンセクションの10♪
PCに関することを色々と。っつうか最近VBネタばっかorz
スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
↑参考になったら拍手よろろ
VBでウィルススキャン(その2)

とりあえずウィルススキャンをかける方法について。

(1) 起動
  スキャンをかけるパスを引数に scan32.exe を叩けばよい。
  scan32.exe を叩くにはWSHを利用。

(2) 結果判定
  ウィルススキャンが実行中か、スキャン終了かは
  "閉じる(&F)"ボタンがEnableかDisableかを判断すれば良い。

  結果については・・・ステータスバーの値を読めば良い。
  ステータスバーを見れば"ウィルスは見つかりませんでした"とか
  メッセージが書いてあるので・・・

  とりあえずWSHでコマンドを叩くと同時にタイマーをセットして
  定期的にウィルススキャン画面の部品("閉じる(&F)")ボタンを
  検索、ボタンがDisableになっていたら
  結果を取得すれば良いって寸法。

実際にやってみたらひとつ問題が。(^^;
ステータスバーの文字の取得って面倒臭いのね。(知らんかった)


ステータスバーの場合って共有メモリを作ってウィルススキャンに対してSendMessageしてステータスバーの値を書き込んでもらって
ReadProcessMemoryで読み込んでなんたらかんたら・・・orz

昔からよくある常套手段らしいけど今そこまで調べてやっている時間もないし、
画面上にウィルススキャンの結果を確証代わり出す必要があったので、

ツール上にPictureBoxを用意、検査結果の画面をキャプチャして
PictureBoxに貼り付ける事でお茶を濁しました。(^^;



んで今回は珍しくソースを晒してみます。
APIを使って色々とやっているしサンプル代わりに
丁度良いので。。。。



'====== APIの定義 ========

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ShowWindowAsync Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

Private Declare Function IsWindowEnabled Lib "user32" (ByVal hWnd As Long) As Long
Private Const SW_RESTORE = 9
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const VK_SNAPSHOT = &H2C 'PrintScreen キー(P1051)
Private Const VK_LMENU = &HA4 'Altキー
Private Const KEYEVENTF_KEYUP = &H2 'キーはアップ状態
Private Const KEYEVENTF_EXTENDEDKEY = &H1 'スキャンコードは拡張コード

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const BM_CLICK = &HF5
Private Const WM_ACTIVATE = &H6


'===== タイマでウィルススキャン画面を監視する関数 ======

Public Function FindVirusCheckResult() As Boolean

FindVirusCheckResult = False

'ウィルススキャン画面の取得
Dim WINDOW_NAME As String
WINDOW_NAME = "VirusScan オンデマンド スキャンの状況 - " & UserData.MyCDDrive
'-- UserData.MyCDDrive ってのはウィルススキャンを行うパスの事
Const BUTTON_NAME As String = "閉じる(&F)"

Dim hWnd As Long
Dim hChild As Long
Dim ret As Long
Dim PicData As Picture

'ウィルススキャン画面の検索
hWnd = FindWindow(vbNullString, WINDOW_NAME)
If hWnd = 0 Then
  '画面が見つからない
  Exit Function
End If

'閉じるボタン検索
hChild = FindWindowEx(hWnd, 0, vbNullString, BUTTON_NAME)
If hChild = 0 Then
  '[閉じる] ボタンが見つからない
  Exit Function
End If

'ボタン状態を取得
ret = IsWindowEnabled(hChild)
If ret <> 1 Then
  '実行中あるいは一時停止中(閉じるボタンはDisable)
  Exit Function
End If

'タイマ停止
FormMain.Timer_ResultChecker.Enabled = False


'ウィルススキャン画面を最前面に持ってくるために
If IsIconic(hWnd) Then
  'もしアイコン化されていたら元に戻す
  Call ShowWindowAsync(hWnd, SW_RESTORE)
  DoEvents
  Sleep 3000
End If

'ウィルススキャン画面を最前面に移動
Call SetForegroundWindow(hWnd)


'ウィルススキャン画面をActiveにして
SendMessage hChild, WM_ACTIVATE, 1, ByVal 0&

'クリップボードをクリアして
Clipboard.Clear

'[ALT]+[Print Screen]でキャプチャして
Call keybd_event(VK_LMENU, &H56, KEYEVENTF_EXTENDEDKEY Or 0, 0)
Call keybd_event(VK_SNAPSHOT, &H79, KEYEVENTF_EXTENDEDKEY Or 0, 0)
Call keybd_event(VK_SNAPSHOT, &H79, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
Call keybd_event(VK_LMENU, &H56, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)

'一度Windowsに制御を戻して
DoEvents

'クリップボード経由で取り込む
If Clipboard.GetFormat(vbCFBitmap) Then
  FormMain.Picture_Result.AutoRedraw = True
  Set FormMain.Picture_Result.Picture = Clipboard.GetData
  FormMain.Picture_Result.Refresh
  FormMain.Picture_Result.AutoRedraw = False
End If

'最後にウィルススキャンの画面を閉じる。というか閉じるボタンを押す
PostMessage hChild, WM_ACTIVATE, 1, ByVal 0&
PostMessage hChild, BM_CLICK, 0, ByVal 0&

FindVirusCheckResult = True

End Function

ちなみにウィルススキャンのエンジンや定義ファイルのバージョンは
レジストリを検索したら書いてあったのでそれを取得しました。


本来ならウィルススキャンを行うための
OSレベルのAPIがありそうな気がするのだけど・・・
よくわからないorz



↑参考になったら拍手よろろ
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

VBでウィルススキャン(その1)

マカフィーウィルススキャンを VB (VB6.0) から実行する方法を考ていた。


色々調べてみた所どうやら検査したいディレクトリを引数に
C:\Program Files\Network Associates\VirusScanにあるscan32.exeを
叩いてやればOKって事がわかった。

要はDOS上から
prompt >scan32.exe C:\temp
てな感じ。


でもこのscan32.exeってのはGUIプログラムな訳
起動するとオンデマンドスキャンのダイアログが出てくるのよね。

VBから実行となるとウィルススキャン自体の終了を判定をしなければならない。するってぇと・・画面のステータスバーの文字列を監視すればいい?もしくはウィルススキャン画面の中断ボタンがEnableかDisableかを見る方法もあり?

んで更にウィルススキャンが終了しても"閉じる"ボタンを
マウスでクリックしないと処理が完全に終わらない。

なんか色々あるけどとりあえず WSHでscan32.exe を起動して
ウィンドウ監視してみますか。。。。
FindWindowでオンデマンドスキャンのウィンドウを
とっ捕まえて、ウィンドウ内の部品のハンドルを
FindWindowExでとっ捕まえれなんとかなるでしょう。


とりあえずやってみますか。
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ


ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

メールフォーム

名前:
メール:
件名:
本文:



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。