none
搜尋應用程式 RRS feed

  • 問題

  • 大大您們好,我在網路上搜尋利用Process.GetProcesses找出目前有再用的應用程式(程式如下),可是我卻發現,若開啟的是資料夾,程式是沒有找到,不知各位大大是否有別的方法,比我這個好,可以搜尋較精確的應用程式,謝謝
                        foreach (Process p in Process.GetProcesses(System.Environment.MachineName))
                        {
                                IntPtr hWnd = p.MainWindowHandle;
                                int length = GetWindowTextLength(hWnd);
                                StringBuilder sb = new StringBuilder(length + 1);
                                GetWindowText(hWnd, sb, sb.Capacity);
                         }

    2010年1月26日 上午 08:47

解答

  • Hi,

    資料夾是透過Explorer.Exe開啟的
    也許您可以參考一下這篇

    How to Get Folder Directory Path from Process Explorer.exe

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 12:49
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 03:40
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 03:47
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 05:38
    • 已標示為解答 Lolota Lee 2010年2月2日 上午 06:41
    2010年1月26日 上午 09:07
  • 參考這篇 http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/ae76f723-3f11-446d-89d3-74a61d240750 其中 璉璉 的回應
    要處理程序請參考 Process 類別, 視窗標題無法使用 Process 類別直接取得。
    要處理其他視窗標題的,都需要呼叫 API ,比如說 FindWindow 、EnumWindow 等,再由 hWnd 取的 ProcessId 對應到 Process
    我的Blog .NET菜鳥自救會
    • 已標示為解答 冰糖旋風 2010年1月27日 上午 03:46
    • 已取消標示為解答 冰糖旋風 2010年1月27日 上午 05:22
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 12:49
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 03:40
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 03:47
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 05:38
    • 已標示為解答 Lolota Lee 2010年2月2日 上午 06:41
    2010年1月26日 上午 09:41
    版主
  • Hi,

    補充一下
    由於IE跟檔案總管都是繼承相同的架構

    因此也可參考小歐大這篇
    [C#]透過 SHDocVw 與 GetForegroundWindow 取得正在使用的 Internet Explorer 網址

    修改成像下面這樣
            Dim shellWindows As SHDocVw.ShellWindows = New SHDocVw.ShellWindowsClass
            For Each w As SHDocVw.InternetExplorer In shellWindows
                Console.WriteLine(w.Application)
                Console.WriteLine(w.AddressBar)
                Console.WriteLine(w.Document)
                Console.WriteLine(w.FullName)
                Console.WriteLine(w.LocationName)
                Console.WriteLine(w.LocationURL)
                Console.WriteLine(w.Name)
                Console.WriteLine(w.Path)
            Next

    自己再加過濾Explorer就好了

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2010年1月27日 上午 03:46
    • 已取消標示為解答 冰糖旋風 2010年1月27日 上午 05:22
    • 已標示為解答 Lolota Lee 2010年2月2日 上午 06:41
    2010年1月26日 上午 10:21
  • 這邊也有現成範例:
    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=34


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 冰糖旋風 2010年1月27日 上午 03:46
    • 已取消標示為解答 冰糖旋風 2010年1月27日 上午 05:22
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 12:49
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 03:40
    • 已標示為解答 Lolota Lee 2010年2月2日 上午 06:41
    2010年1月26日 下午 05:12
  • 利用EnumWindows找出來的 會有多筆資料
    有許多方法可以去過濾
    例如:
    EnumWindows(ewp, this.Handle.ToInt32());

    private bool EvalWindow(IntPtr hWnd, int lParam)
    {
        if (hWnd.ToInt32() == lParam)
        {
              listBox3.Items.Add(hWnd.ToString());
              return false;
        }
        return true;
    }

    另外 模擬傳送組合鍵 有時失敗 有可能是系統忙碌 相關的視窗還沒變成Active
    或許可以透過 Process 的Responding
    P.S. 模擬Alt +F 應該是 SendKeys.SendWait("%F"); 才對 

    • 已標示為解答 冰糖旋風 2010年1月28日 上午 12:48
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 03:40
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 03:47
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 05:38
    • 已標示為解答 Lolota Lee 2010年2月2日 上午 06:41
    2010年1月27日 下午 01:05

所有回覆

  • Hi,

    資料夾是透過Explorer.Exe開啟的
    也許您可以參考一下這篇

    How to Get Folder Directory Path from Process Explorer.exe

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 12:49
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 03:40
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 03:47
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 05:38
    • 已標示為解答 Lolota Lee 2010年2月2日 上午 06:41
    2010年1月26日 上午 09:07
  • 資料夾並非是應用程式
    你可以利用p.ProcessName.ToUpper() == "EXPLORER" 來判斷
    2010年1月26日 上午 09:12
  • 參考這篇 http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/ae76f723-3f11-446d-89d3-74a61d240750 其中 璉璉 的回應
    要處理程序請參考 Process 類別, 視窗標題無法使用 Process 類別直接取得。
    要處理其他視窗標題的,都需要呼叫 API ,比如說 FindWindow 、EnumWindow 等,再由 hWnd 取的 ProcessId 對應到 Process
    我的Blog .NET菜鳥自救會
    • 已標示為解答 冰糖旋風 2010年1月27日 上午 03:46
    • 已取消標示為解答 冰糖旋風 2010年1月27日 上午 05:22
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 12:49
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 03:40
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 03:47
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 05:38
    • 已標示為解答 Lolota Lee 2010年2月2日 上午 06:41
    2010年1月26日 上午 09:41
    版主
  • Hi,

    補充一下
    由於IE跟檔案總管都是繼承相同的架構

    因此也可參考小歐大這篇
    [C#]透過 SHDocVw 與 GetForegroundWindow 取得正在使用的 Internet Explorer 網址

    修改成像下面這樣
            Dim shellWindows As SHDocVw.ShellWindows = New SHDocVw.ShellWindowsClass
            For Each w As SHDocVw.InternetExplorer In shellWindows
                Console.WriteLine(w.Application)
                Console.WriteLine(w.AddressBar)
                Console.WriteLine(w.Document)
                Console.WriteLine(w.FullName)
                Console.WriteLine(w.LocationName)
                Console.WriteLine(w.LocationURL)
                Console.WriteLine(w.Name)
                Console.WriteLine(w.Path)
            Next

    自己再加過濾Explorer就好了

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2010年1月27日 上午 03:46
    • 已取消標示為解答 冰糖旋風 2010年1月27日 上午 05:22
    • 已標示為解答 Lolota Lee 2010年2月2日 上午 06:41
    2010年1月26日 上午 10:21
  • 這邊也有現成範例:
    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=34


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 冰糖旋風 2010年1月27日 上午 03:46
    • 已取消標示為解答 冰糖旋風 2010年1月27日 上午 05:22
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 12:49
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 03:40
    • 已標示為解答 Lolota Lee 2010年2月2日 上午 06:41
    2010年1月26日 下午 05:12
  • 大大您們好,謝謝您們幫我,在請問一下,我是利用 FindWindow 、EnumWindow 方式找到 hWnd ,請問c#提供的handler和我找到的 hWnd ,意思是相同的嗎。我想要找我開啟c#執行這個程式的hWnd,我是利用MyNowhWnd = FindWindow(null, this.Text),但找出來卻和我利用EnumWindow 找出的hWnd不同,再麻煩大大幫幫我,謝謝
    2010年1月27日 上午 03:48
  • 你的EnumWindows所傳入的CallBack Function是如何implement的?

    另外如果你的WindowForm Text屬性的值 是空字串
    那有很大的機會使用this.Handle跟使用FindWindow(null,this.Text)會得到不同的答案
    2010年1月27日 上午 07:43
  • 我是這樣應用的,謝謝大大,如果說是在form_load才將text寫入值也會有影響嗎,謝謝
    [DllImport("user32.dll")]
            private static extern int EnumWindows(EnumWindowsProc ewp, int lParam);

    public delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);
            private void Form1_Load(object sender, EventArgs e)
            {           
                this.Text = "AutoSave";
                EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);
                EnumWindows(ewp, 0);
            }
            private bool EvalWindow(IntPtr hWnd, int lParam)
            {
                uint ProcessId = 0;
                if (IsWindowVisible(hWnd))
                {
                    listBox3.Items.Add(hWnd.ToString());
                }
                return (true); 
            }



    大大您好,我可以順便請問一下,我模擬鍵盤方式是利用
    SetForegroundWindow(hWnd);
    SendKeys.SendWait("%{y}"); //模擬按下 Alt+f
    可是有時會有成功失敗的問題,可以請問大大我該往哪個方向尋找,謝謝
    2010年1月27日 上午 09:45
  • 利用EnumWindows找出來的 會有多筆資料
    有許多方法可以去過濾
    例如:
    EnumWindows(ewp, this.Handle.ToInt32());

    private bool EvalWindow(IntPtr hWnd, int lParam)
    {
        if (hWnd.ToInt32() == lParam)
        {
              listBox3.Items.Add(hWnd.ToString());
              return false;
        }
        return true;
    }

    另外 模擬傳送組合鍵 有時失敗 有可能是系統忙碌 相關的視窗還沒變成Active
    或許可以透過 Process 的Responding
    P.S. 模擬Alt +F 應該是 SendKeys.SendWait("%F"); 才對 

    • 已標示為解答 冰糖旋風 2010年1月28日 上午 12:48
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 03:40
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 03:47
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 05:38
    • 已標示為解答 Lolota Lee 2010年2月2日 上午 06:41
    2010年1月27日 下午 01:05
  • 先用 spyxx.exe 確認所有的 hWnd 。
    spyxx.exe 在 C:\Program Files 下搜尋。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 冰糖旋風 2010年1月28日 上午 03:47
    • 已取消標示為解答 冰糖旋風 2010年1月28日 上午 05:38
    2010年1月27日 下午 05:14
  • 謝謝各位大大
    2010年1月28日 上午 12:49
  • 大大我在請教一下,我是利用process.Responding和process.HasExited方式判斷  ,但是仍然會有有些視窗可以關閉但有些不行關閉,既然有些視窗都可以關閉,那還有可能是程式問題嗎,在麻煩大大幫我一下,謝謝
    2010年1月28日 上午 05:38
  • 請不要把 "標示為解答" 的功能當好玩的,OK?

    問題解決了就解決了,額外的問題可以另開新討論串來討論(並且附上前一個問題的連結),否則後面來看的人會被一堆 "標示" 又 "取消標示" 的記錄給搞混了,就算那個回應是正確的也會被當做不是。

    感恩。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    2010年1月28日 上午 06:54
    版主
  • 不是很懂你的需求
    若是要強制關閉 應用程式
    可以使用Process.CloseMainWindow或Process.Kill
    ==================================
    另 你的問題與原主題有偏離的跡象
    建議你另開一主題會較適當

    2010年1月29日 上午 02:13