代码之家  ›  专栏  ›  技术社区  ›  balalakshmi

C:是否可以将参数挂钩到现有进程。示例启动iexplore.exe,然后使其导航到网站

  •  1
  • balalakshmi  · 技术社区  · 16 年前

    调用Internet Explorer的代码如下

     System.Diagnostics.Process oProcess = new System.Diagnostics.Process();
                    oProcess.StartInfo.FileName = "C:\\Program Files\\Internet Explorer\\iexplore.exe";
                    oProcess.Start();
    

    一旦启动此进程,是否可以为其分配URL?

    4 回复  |  直到 16 年前
        1
  •  0
  •   adriaanp    16 年前

    通过使用interop,这看起来是可能的。看看这个 codeproject project 它做你想做的。

        2
  •  1
  •   Darin Dimitrov    16 年前
    Process.Start(
        "C:\\Program Files\\Internet Explorer\\iexplore.exe", 
        "http://www.google.com"
    );
    

    或使用默认浏览器打开:

    Process.Start("http://www.google.com");
    
        3
  •  0
  •   Sharique    16 年前

    是的,你能做到。必须提供URL作为参数。看一看 this .

    Process.Start("IExplore.exe", "www.northwindtraders.com");
    
        4
  •  0
  •   kicsit    16 年前

    一般来说,不可能“将参数挂钩到现有进程”。您将需要对所讨论的应用程序有一定的了解,并实现逐案解决方案。

    但是,有了IE(如您的示例中所示),您就很幸运了,因为它可以通过COM进行控制。请参阅Adriaanp的答案以获得干净的解决方案。

    同样,如果您今天正好处于一种黑客的情绪中,可能会有一个更简单的实现解决方案。这绝不是正确的方法,也不能保证在任何情况下都能工作,但是我已经看到在生产代码中使用了类似的方法。

    我们的想法是使用win-api来查找浏览器窗口,找到地址栏并输入你的URL——很便宜,不是吗?!这样就消除了所有的COM依赖关系,并且很快就会开始滚动。

    这里有一些代码(只有一个公共方法 DoPopup ,使用URL和浏览器窗口标题的某些部分调用(如果愿意,可以使用其他方法获取浏览器窗口的句柄):

    static class PopupHelper
    {
        class SearchData
        {
            public readonly String Criterion;
            public IntPtr ResultHandle;
    
            public SearchData(String criterion)
            {
                Criterion = criterion;
                ResultHandle = IntPtr.Zero;
            }
        }
    
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumWindows(EnumWindowsProc callback, ref SearchData data);
    
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumChildWindows(IntPtr window, EnumWindowsProc callback, ref SearchData data);
    
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int GetClassName(IntPtr handle, StringBuilder result, int length);
    
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int GetWindowText(IntPtr handle, StringBuilder result, int length);
    
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetForegroundWindow(IntPtr windowHandle);
    
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr windowHandle, UInt32 Msg, IntPtr wParam, StringBuilder lParam);
    
        delegate bool EnumWindowsProc(IntPtr hWnd, ref SearchData data);
    
        static IntPtr SearchForWindowByTitle(string title)
        {
            SearchData searchData = new SearchData(title);
    
            EnumWindows(new EnumWindowsProc(delegate(IntPtr handle, ref SearchData searchDataRef)
            {
                StringBuilder candidate = new StringBuilder(1024);
                GetWindowText(handle, candidate, candidate.Capacity);
                if (!candidate.ToString().Contains(searchDataRef.Criterion)) { return true; }
                searchDataRef.ResultHandle = handle;
                return false;
            }), ref searchData);
    
            return searchData.ResultHandle;
        }
    
        static IntPtr SearchForChildWindowByClassName(IntPtr parent, string className)
        {
            SearchData searchData = new SearchData(className);
    
            EnumChildWindows(parent, new EnumWindowsProc(delegate(IntPtr handle, ref SearchData searchDataRef)
            {
                StringBuilder candidate = new StringBuilder(64);
                GetClassName(handle, candidate, candidate.Capacity);
                if (candidate.ToString() != searchDataRef.Criterion) { return true; }
                searchDataRef.ResultHandle = handle;
                return false;
    
            }), ref searchData);
    
            return searchData.ResultHandle;
        }
    
        static void NavigateToUrlInExistingBrowserWindow(IntPtr browserWindowHandle, IntPtr addressEditBoxHandle, string url)
        {
            StringBuilder addressBuilder = new StringBuilder(url);
    
            const uint WM_SETTEXT = 0x000C;
            const uint WM_KEYDOWN = 0x0100;
            const uint RETURN_KEY = 13;
    
            SendMessage(addressEditBoxHandle, WM_SETTEXT, IntPtr.Zero, addressBuilder);
            SendMessage(addressEditBoxHandle, WM_KEYDOWN, new IntPtr(RETURN_KEY), null);
    
            SetForegroundWindow(browserWindowHandle);
        }
    
        public static void DoPopup(string url, string captionPart)
        {
            IntPtr windowHandle = SearchForWindowByTitle(captionPart);
            if (windowHandle != IntPtr.Zero)
            {
                IntPtr addressEditBoxHandle = SearchForChildWindowByClassName(windowHandle, "Edit");
                if (addressEditBoxHandle != IntPtr.Zero)
                {
                    NavigateToUrlInExistingBrowserWindow(windowHandle, addressEditBoxHandle, url);
                    return;
                }
            }
    
            Process.Start("iexplore", url);
        }
    }