2017-01-30 4 views
2

私は、各プロセススレッドからすべてのウィンドウ名をコンソールに列挙する小さなアプリケーションを作ろうとしています。C#各プロセススレッドごとにすべてのウィンドウを列挙しようとしています

私は現在、Windows 7マシンで正常に動作するこのコードを使用していますが、何らかの理由でスタックトレースやエラーメッセージが表示されずにWindows 10にスタックしていますが、ほとんどすべてをtry-catchの中に追加しようとしましたが、どんなメッセージも聞こえないので、私は迷っています。

using System; 
    using System.Collections.Generic; 
    using System.Diagnostics; 
    using System.Runtime.InteropServices; 
    using System.Text; 

    namespace ConsoleApplication3 
    { 
     class Program 
     { 
      private delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam); 

      [DllImport("user32.dll")] 
      private static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam); 

      [DllImport("user32.dll", CharSet = CharSet.Auto)] 
      private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam); 

      static void Main(string[] args) 
      { 
       Process[] processes = Process.GetProcesses(); 
       Console.WriteLine("Detected: " + processes.Length + " processes."); 
       foreach (Process process in processes) 
       { 
        IEnumerable<IntPtr> windowHandles = null; 
        try 
        { 
         windowHandles = EnumerateProcessWindowHandles(process); 
        } 
        catch (Exception e) 
        { 
         Console.WriteLine(e.StackTrace); 
         continue; 
        } 

        Console.WriteLine("Checking process" + process.ProcessName); 
        foreach (var handle in windowHandles) 
        { 
         StringBuilder message = new StringBuilder(); 
         try 
         { 
          SendMessage(handle, 0x000D, message.Capacity, message); 
         } 
         catch (Exception e) 
         { 
          Console.WriteLine(e.StackTrace); 
          continue; 
         } 
         if (message.Length == 0) 
         { 
          continue; 
         } 
         Console.WriteLine("Window name: " + message.ToString()); 
        } 
       } 
       Console.WriteLine("Finished!"); 
       Console.ReadLine(); 
      } 

      private static IEnumerable<IntPtr> EnumerateProcessWindowHandles(Process process) 
      { 
       List<IntPtr> handles = new List<IntPtr>(); 

       ProcessThreadCollection threads = null; 
       try 
       { 
        threads = process.Threads; 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine(e.StackTrace); 
        return handles; 
       } 

       foreach (ProcessThread thread in threads) 
       { 
        try 
        { 
         EnumThreadWindows(thread.Id, (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero); 
        } 
        catch (Exception e) 
        { 
         Console.WriteLine(e.StackTrace); 
         continue; 
        } 
       } 
       return handles; 
      } 
     } 
    } 

それが立ち往生しなかった理由についての任意のアイデア:ここ

は、コードのですか?

UPDATE

using System; 
    using System.Collections.Generic; 
    using System.Diagnostics; 
    using System.Runtime.InteropServices; 
    using System.Text; 

    namespace ConsoleApplication3 
    { 
     class Program 
     { 
      private delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam); 

      [DllImport("user32.dll")] 
      [return: MarshalAs(UnmanagedType.Bool)] 
      private static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam); 

      [DllImport("user32.dll", CharSet = CharSet.Auto)] 
      private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam); 

      [DllImport("user32.dll")] 
      [return: MarshalAs(UnmanagedType.Bool)] 
      private static extern bool IsWindowVisible(IntPtr handle); 

      static void Main(string[] args) 
      { 
       Process[] processes = Process.GetProcesses(); 
       Console.WriteLine("Detected: " + processes.Length + " processes."); 
       foreach (Process process in processes) 
       { 
        IEnumerable<IntPtr> windowHandles = null; 
        try 
        { 
         windowHandles = EnumerateProcessWindowHandles(process); 
        } 
        catch (Exception e) 
        { 
         Console.WriteLine(e.StackTrace); 
         continue; 
        } 

        Console.WriteLine("Checking process: " + process.ProcessName); 
        foreach (IntPtr handle in windowHandles) 
        { 
         if (handle == null) 
         { 
          continue; 
         } 
         if (!IsWindowVisible(handle)) 
         { 
          continue; 
         } 
         StringBuilder message = new StringBuilder(); 
         int capacity = 0; 
         try 
         { 
          capacity = message.Capacity; 
         } 
         catch(Exception e) 
         { 
          Console.WriteLine(e.StackTrace); 
          continue; 
         } 
         try 
         { 
          SendMessage(handle, 0x000D, capacity, message); 
         } 
         catch (Exception e) 
         { 
          Console.WriteLine(e.StackTrace); 
          continue; 
         } 
         if (message.Length == 0) 
         { 
          continue; 
         } 
         Console.WriteLine("Window name: " + message.ToString()); 
        } 
       } 
       Console.WriteLine("Finished!"); 
       Console.ReadLine(); 
      } 

      private static IEnumerable<IntPtr> EnumerateProcessWindowHandles(Process process) 
      { 
       List<IntPtr> handles = new List<IntPtr>(); 

       ProcessThreadCollection threads = null; 
       try 
       { 
        threads = process.Threads; 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine(e.StackTrace); 
        return handles; 
       } 

       foreach (ProcessThread thread in threads) 
       { 
        if (thread == null) 
        { 
         continue; 
        } 

        int threadId = 0; 
        try 
        { 
         threadId = thread.Id; 
        } 
        catch(Exception e) 
        { 
         Console.WriteLine(e.StackTrace); 
         continue; 
        } 
        try 
        { 
         EnumThreadWindows(threadId, (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero); 
        } 
        catch (Exception e) 
        { 
         Console.WriteLine(e.StackTrace); 
         continue; 
        } 
       } 
       return handles; 
      } 
     } 
    } 

すべてのいただきありがとうございます。

+0

私はこれは、Windows 10サンドボックスのアプリケーションとアプリケーションが、私は道に関係していると考えていますわからない。私は、私たちが使っている方法を深く知ることができないことを知っており、そうする正しい方法を知らない。 Windows 10は、アプリケーションをホストするために多くの仮想環境を使用しているので、私はここで推測しています...これは何の答えもとらないでください。 –

+0

あなたの答えをありがとうMichael Pucket II、私は別のマシンでWindows 10で試してみましたが、うまくいきましたが、コード7のメッセージ/トレース/エラーなしでランダムにコードが失敗するようです...本当に私は私の問題を解決し始めます。 –

+0

私は考えました。あなたのwindowHandles = nullは既にあります。 EnumerateProcessWindowHandles(プロセス)は失敗せずにnullを返します。次に、foreach(var handle in windowHandles)と入力すると、クラッシュします。エラーが発生するはずですが、展開されている場合はそうではありません。私は、foreachループが少なくともゼロカウント値を持ち、決してnullになる機会はないように、windowHandlesを空の列挙に設定します。それは私が直ちに気付くことができた唯一の欠陥であり、それが私であればそこから始める必要があります。 –

答えて

0

は、問題がまだ私はそれが何をするかだAPI GetLastErrorを使用することをお勧め生じた場合、管理者として、コンソールアプリケーションを実行してみてください:

は、呼び出し側スレッドの最後のエラーコード値を取得します。最後のエラーコードは、スレッドごとに維持されます。複数のスレッドは、お互いの最後のエラーコードを上書きしません。

問題を知っている値を読み取る試してみてください、それを使用する方法のguidenceは、このリンクを試してみてください。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx

+0

あなたの答えをありがとう、私はこれを試しましたが、私は出力を得ることができませんでした。 –

関連する問題