Option Explicit'API Constants
Const SMTO_BLOCK = &H1
Const SMTO_ABORTIFHUNG = &H2
Const WM_NULL = &H0
Const WM_CLOSE = &H10
Const PROCESS_ALL_ACCESS = &H1F0FFF
'API functions
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, _
lpdwProcessId As Long) As LongPrivate Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" _
(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As _
Long, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As LongPrivate Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, _
ByVal uExitCode As Long) As LongPrivate modObjIE As Object
Private modlngWndIE As LongPrivate Sub cmdCheck_Click()
  Dim lngResult As Long
  Dim lngReturnValue As Long
  lngReturnValue = SendMessageTimeout(modlngWndIE, WM_NULL, 0&,  
  0&, SMTO_ABORTIFHUNG And SMTO_BLOCK, 1000, lngResult)
  If lngReturnValue Then
  MsgBox "Responding"
  Else
  MsgBox "Not Responding","Block tester"
  End If
End SubPrivate Sub cmdLaunch_Click()
  Set modObjIE = Nothing
  Set modObjIE = CreateObject("InternetExplorer.Application")
  modObjIE.Visible = True
  modObjIE.Navigate2 "http://www.microsoft.com"
  modlngWndIE = modObjIE.hwnd
End SubPrivate Sub cmdKill_Click()
  Dim lngProcessID As Long
  Dim lngReturnValue As Long
  Dim lngProcess As Long
  lngReturnValue = GetWindowThreadProcessId(modlngWndIE, lngProcessID)
  lngProcess = OpenProcess(PROCESS_ALL_ACCESS, 0&, lngProcessID)
  lngReturnValue = TerminateProcess(lngProcess, 0&)
End Sub
翻译好的可以加分
下面是源代码地址:http://support.microsoft.com/kb/231844

解决方案 »

  1.   


    引用Microsoft Internet Controlsusing System;
    using System.Windows.Forms;
    using System.Threading;
    using System.Runtime.InteropServices;namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private IntPtr modlngWndIE = IntPtr.Zero;        private uint WM_NULL = 0x0;        [DllImport("user32.dll", SetLastError = true)]
            private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);        [DllImport("kernel32.dll")]
            private static extern IntPtr OpenProcess(ProcessAccessTypes dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, uint dwProcessId);        [DllImport("kernel32.dll", SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            private static extern IntPtr SendMessageTimeout(
                IntPtr hWnd,
                uint Msg,
                UIntPtr wParam,
                IntPtr lParam,
                SendMessageTimeoutFlags fuFlags,
                uint uTimeout,
                out UIntPtr lpdwResult);        private enum ProcessAccessTypes
            {
                PROCESS_TERMINATE = 0x00000001,
                PROCESS_CREATE_THREAD = 0x00000002,
                PROCESS_SET_SESSIONID = 0x00000004,
                PROCESS_VM_OPERATION = 0x00000008,
                PROCESS_VM_READ = 0x00000010,
                PROCESS_VM_WRITE = 0x00000020,
                PROCESS_DUP_HANDLE = 0x00000040,
                PROCESS_CREATE_PROCESS = 0x00000080,
                PROCESS_SET_QUOTA = 0x00000100,
                PROCESS_SET_INFORMATION = 0x00000200,
                PROCESS_QUERY_INFORMATION = 0x00000400,
                STANDARD_RIGHTS_REQUIRED = 0x000F0000,
                SYNCHRONIZE = 0x00100000,
                PROCESS_ALL_ACCESS = PROCESS_TERMINATE | PROCESS_CREATE_THREAD | PROCESS_SET_SESSIONID | PROCESS_VM_OPERATION |
                  PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_DUP_HANDLE | PROCESS_CREATE_PROCESS | PROCESS_SET_QUOTA |
                  PROCESS_SET_INFORMATION | PROCESS_QUERY_INFORMATION | STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE
            }        [Flags]
            enum SendMessageTimeoutFlags : uint
            {
                SMTO_NORMAL = 0x0,
                SMTO_BLOCK = 0x1,
                SMTO_ABORTIFHUNG = 0x2,
                SMTO_NOTIMEOUTIFNOTHUNG = 0x8
            }        private void button1_Click(object sender, EventArgs e)
            {
                //InternetExplorer.Application"
                SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
                ie.Navigate2("http://www.microsoft.com");
                ie.Visible = true;
                modlngWndIE = (IntPtr)ie.HWND;
            }        private void button2_Click(object sender, EventArgs e)
            {
                uint lngProcessID = 0;
                uint lngReturnValue = 0;
                IntPtr lngProcess = IntPtr.Zero;            lngReturnValue = GetWindowThreadProcessId(modlngWndIE, out lngProcessID);
                lngProcess = OpenProcess(ProcessAccessTypes.PROCESS_ALL_ACCESS, false, lngProcessID);
                TerminateProcess(lngProcess, 0);
            }        private void button3_Click(object sender, EventArgs e)
            {
                UIntPtr lngResult = UIntPtr.Zero;
                IntPtr lngReturnValue = IntPtr.Zero;
                lngReturnValue = SendMessageTimeout(modlngWndIE, WM_NULL, UIntPtr.Zero, IntPtr.Zero, SendMessageTimeoutFlags.SMTO_ABORTIFHUNG | SendMessageTimeoutFlags.SMTO_BLOCK, 1000, out lngResult);
                if (lngReturnValue != IntPtr.Zero)
                {
                    MessageBox.Show("Responding");
                }
                else
                {
                    MessageBox.Show("Not Responding");
                }
            }
        }
    }