iT邦幫忙

0

C#程式跳過EDGE在 WIN10/11 啟動IE成功, 但IE視窗如何最大化?-已解決!

  • 分享至 

  • xImage

因為公司程式,還需要用IE開啟
故將之前VBS寫的
set IE = CreateObject("InternetExplorer.Application")
改用C#寫, 並編譯成EXE,
讓公司程式可以傳URL呼叫, 以便開啟特殊URL
且 是免安裝的綠色程式
將EXE檔COPY到任何WIN OS 上都可以馬上用
找到最大化方法了
GetSystemMetrics
並將程式簡潔化, 少了很多行
不囉嗦! 上SOURCE CODE

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace IE.NET
{
    internal class Program
    {
        //呼叫 WIN 元件取得螢幕大小
        [DllImport("user32.dll")]
        public static extern int GetSystemMetrics(int screensize);
        const int SM_CXSCREEN = 0;
        const int SM_CYSCREEN = 1;

        //主程式
        static void Main(string[] args)
        {
            //首頁
            string StartURL = "http://IP/XXXX.asp";
            //讓第三方傳參數呼叫, 帶入所需開啟的URL
            if (args.Length > 0)
            {
                StartURL = args[0];
                //如果URL很長要組合起來
                if (args.Length > 1)
                {
                    for (int i = 1; i < args.Length; i++)
                    {
                        StartURL = StartURL + "%20" + args[i];
                    }
                }
            }

            //使用 GetSystemMetrics 取得螢幕大小
            double wWidth = GetSystemMetrics(SM_CXSCREEN); 
            double wHeight = GetSystemMetrics(SM_CYSCREEN); 
            
            // 使用 GetTypeFromProgID 呼叫IE
            var MemberAccess = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase;
            var type = Type.GetTypeFromProgID("InternetExplorer.Application");
            var ie = Activator.CreateInstance(type);
            //設定IE視窗全螢幕
            ie.GetType().InvokeMember("Visible", MemberAccess | BindingFlags.SetProperty, null, ie, new object[1] { true });
            ie.GetType().InvokeMember("Top", MemberAccess | BindingFlags.SetProperty, null, ie, new object[1] { 0 });
            ie.GetType().InvokeMember("Left", MemberAccess | BindingFlags.SetProperty, null, ie, new object[1] { 0 });
            ie.GetType().InvokeMember("Height", MemberAccess | BindingFlags.SetProperty, null, ie, new object[1] { wHeight });
            ie.GetType().InvokeMember("Width", MemberAccess | BindingFlags.SetProperty, null, ie, new object[1] { wWidth });
            ie.GetType().InvokeMember("Navigate", MemberAccess | BindingFlags.InvokeMethod, null, ie, new object[] { StartURL });

        }

    }
}

感謝多位邦友幫幫忙!
提供很多方向!
謝謝!

參考:
https://welkingunther.pixnet.net/blog/post/26821658
https://blog.darkthread.net/blog/run-iexplore-in-win11/

看更多先前的討論...收起先前的討論...
dscwferp iT邦高手 1 級 ‧ 2023-05-03 21:05:26 檢舉
發現...多年來第一次發問!!!!
謝謝大家!
遇到IE問題,一律請對方卸載 XDDD
kw6732 iT邦研究生 4 級 ‧ 2023-05-04 09:07:25 檢舉
@dscwferp
你這帳號的身分還不太容易能發問問題的說~
通常是要上來回問題的。
froce iT邦大師 1 級 ‧ 2023-05-04 10:35:47 檢舉
我倒覺得你努力的方向錯了,MS預定2029完全屏棄IE,你該改的是舊程式吧。
dscwferp iT邦高手 1 級 ‧ 2023-05-04 11:53:50 檢舉
舊程式當然要改<-更改中
但過渡期還是要過啊
還有6年才到2029
還有1~2年舊程式才能改完
公司總要持續營運
薪水才能拿到啊
我之前都說"努力的方向錯了..."+"一律請對方卸載..."
等碰到後
為了薪水只好"我來處理..."
dscwferp iT邦高手 1 級 ‧ 2023-05-04 11:57:29 檢舉
@kw6732
謝謝!
froce iT邦大師 1 級 ‧ 2023-05-04 13:09:39 檢舉
edge有ie相容模式,過渡期我會建議就直接設定ie相容模式就好。不用特地開個ie還浪費時間寫個程式去呼叫,或乾脆用bat處理就好。
dscwferp iT邦高手 1 級 ‧ 2023-05-04 14:07:28 檢舉
謝謝!
kw6732 iT邦研究生 4 級 ‧ 2023-05-04 15:28:51 檢舉
@froce 如果沒有特殊的需求,批次檔的方向會比較是好選擇。
@dscwferp 手中有"倚天劍",一定是順手使開來的(寫程式)。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
rogeryao
iT邦超人 7 級 ‧ 2023-05-03 21:46:09
最佳解答

ShellExecute(Handle, 'open', 'Excel', PChar(s), nil, SW_SHOWMAXIMIZED);
ShellExecute(Handle, 'open', 'Excel', PChar(s), nil, SW_MAXIMIZE);

請參閱:C# 客戶端程序調用外部程序的三種實現
請參閱:ShowWindow function (winuser.h)

dscwferp iT邦高手 1 級 ‧ 2023-05-03 22:04:04 檢舉

謝謝邦忙!
但用了GetTypeFromProgID
無法用ShellExecute
還是感謝!

dscwferp iT邦高手 1 級 ‧ 2023-05-05 10:58:21 檢舉

雖然自行找到方法
但roger私訊一些方案給我
感謝邦忙!
選您最佳答案喔!

0
海綿寶寶
iT邦大神 1 級 ‧ 2023-05-04 07:22:30

Google 到的看看合不合用
AcadApp.GetType().InvokeMember("WindowState", BindingFlags.SetProperty, Nothing, AcadApp, New Object() {1}, Nothing)
資料來源

看更多先前的回應...收起先前的回應...
dscwferp iT邦高手 1 級 ‧ 2023-05-04 09:03:11 檢舉

SORRY!
它是呼叫AutoCAD 的元件
所以測試後不適用
感謝邦忙!

他是 AutoCAD 元件
而你有你的 o.GetType

o.GetType().InvokeMember("WindowState", BindingFlags.SetProperty, Nothing, AcadApp, New Object() {1}, Nothing);可行嗎?

dscwferp iT邦高手 1 級 ‧ 2023-05-04 22:40:02 檢舉

測試過!
IE 沒有 "WindowState" 屬性
所以測試失敗喔!

...那我就無技可施了
/images/emoticon/emoticon25.gif

0
wup926
iT邦新手 3 級 ‧ 2023-05-05 07:37:07

幫你問問ChatGPT大神,他回答如下,希望可以幫到你。

您可以使用 C# 的 Process.Start 方法啟動 Internet Explorer,並使用 Process 類的其他成員控制 Internet Explorer 視窗的大小和位置。

以下是一個示例代碼,可在 C# 中啟動 Internet Explorer,將其最大化,並將其移動到屏幕左上角:

using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe");
        startInfo.WindowStyle = ProcessWindowStyle.Maximized;
        Process process = Process.Start(startInfo);
        process.WaitForInputIdle();
        IntPtr handle = process.MainWindowHandle;
        SetWindowPos(handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);
    }

    const int SWP_NOSIZE = 0x0001;
    const int SWP_NOZORDER = 0x0004;
    const int SWP_SHOWWINDOW = 0x0040;

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
}

這段代碼使用 ProcessStartInfo 來指定要啟動的應用程序和窗口樣式。在這種情況下,我們將 WindowStyle 屬性設置為 ProcessWindowStyle.Maximized,這將使 Internet Explorer 在啟動時最大化。

接下來,使用 Process.Start 方法來啟動 Internet Explorer 進程。使用 process.WaitForInputIdle 方法等待進程變得可交互,這樣我們才能夠操縱它的窗口。

使用 process.MainWindowHandle 屬性獲取 Internet Explorer 窗口的句柄,然後使用 SetWindowPos 函數來將其移動到屏幕左上角,同時保持其大小不變。

dscwferp iT邦高手 1 級 ‧ 2023-05-05 09:13:12 檢舉

感謝邦忙
但呼叫"iexplore.exe"
開啟的是EDGE啊!
不行喔!
謝謝!

wup926 iT邦新手 3 級 ‧ 2023-05-05 10:25:54 檢舉

ChatGPT表示:
確實,在 Windows 10/11 上,預設情況下使用 iexplore.exe 啟動的是 Microsoft Edge 瀏覽器,而不是 Internet Explorer。如果您需要啟動 Internet Explorer,您需要使用 Internet Explorer 的可執行文件 iexplore.exe 的完整路徑,而不是僅僅使用應用程式名稱。

通常情況下,Internet Explorer 的可執行文件位於 C:\Program Files\Internet Explorer 目錄下。因此,您可以將示例代碼中的 iexplore.exe 修改為 C:\Program Files\Internet Explorer\iexplore.exe 來啟動 Internet Explorer。

using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Program Files\Internet Explorer\iexplore.exe");
        startInfo.WindowStyle = ProcessWindowStyle.Maximized;
        Process process = Process.Start(startInfo);
        process.WaitForInputIdle();
        IntPtr handle = process.MainWindowHandle;
        SetWindowPos(handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);
    }

    const int SWP_NOSIZE = 0x0001;
    const int SWP_NOZORDER = 0x0004;
    const int SWP_SHOWWINDOW = 0x0040;

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
}

請注意,如果您的系統上的 Internet Explorer 安裝路徑與上述路徑不同,請相應地修改代碼中的路徑,希望這對您有所幫助。

dscwferp iT邦高手 1 級 ‧ 2023-05-05 10:54:43 檢舉

感謝邦忙
但還是開啟EDGE啊!
不行喔!
謝謝!
我已找到方法了
還是用老方法(呼叫WIN OS元件 user32.dll)!

我要發表回答

立即登入回答