-2

このコードをチェックして、実装を手伝ってくれるかどうかを確認したいと思います

もしそうなら、「a」で始まり、「b」で始まるプロセスのみを取得して、より速くクエリを実行する方法はありますか?

filterパラメータを使用することによるものですか)

によって必要とされるパラメータを使用して他の方法で実行できますか

EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero)

ネイティブメソッドを使用するだけでなく、別のメソッドを呼び出すEnumDesktopWindows()にはどうすればよいですか?前述のようにフィルタリング...一種の「ヘルパー」メソッド

 private const string USER32 = "user32.dll";

    internal delegate bool EnumDelegate(IntPtr hWnd, int lParam);

    [DllImport(WindowsFunctions.USER32, EntryPoint = "GetWindowText", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);

    [DllImport(WindowsFunctions.USER32)]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool IsWindowVisible(IntPtr hWnd);

    [DllImport(WindowsFunctions.USER32)]
    internal static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);

    [DllImport(WindowsFunctions.USER32)]
    internal static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpfn, IntPtr lParam);







public class WindowData
{
    public string Title { get; set; }
    public long ProcessId { get; set; }
    public long ThreadId { get; set; }
    public IntPtr HWindow { get; set; }
}


        var collection = new List<WindowData>();

        EnumDelegate filter = delegate(IntPtr hWnd, int lParam)
        {
            StringBuilder strbTitle = new StringBuilder(255);
            int nLength = WindowsFunctions.GetWindowText(hWnd, strbTitle, strbTitle.Capacity + 1);
            string strTitle = strbTitle.ToString();

            if (IsWindowVisible(hWnd) && !string.IsNullOrEmpty(strTitle))
            {
                int pid;
                int threadId = WindowsFunctions.GetWindowThreadProcessId(hWnd, out pid);

                collection.Add(new WindowData()
                {
                    Title = strbTitle.ToString(),
                    ProcessId = pid,
                    ThreadId = threadId,
                    HWindow = hWnd
                });
            }

            return true;
        };



        if (EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero))
        {
            return collection.ToArray();
        }

        return null;
    }
4

1 に答える 1

0

これは私が一時的な解決策として思いついたものです

public static class MyProc
    {
        public static IntPtr WoWhWnd;
        public static string WoWProcName;
        public static string WowMainWinTitle;
        public static int WowID;
        public static IntPtr MyApphWnd;
        public static string MyAppProcName;
        public static string MyAppMainWinTitle;
        public static int MyAppID;
    }


    public void bring(string handletoFront)
    {
        switch (handletoFront)
        {
            default:

                SetForegroundWindow(MyProc.WoWhWnd);

                break;
            case "MyApp":

                SetForegroundWindow(MyProc.MyApphWnd);
                                    break;
        }


    }


           #region <<=========== Enumerating Processes   ============>>

        void  ShowP1(){

            IEnumerable<Process> processes = from p in Process.GetProcesses() where p.ProcessName.StartsWith(TBXSearchWindowTerm.Text) || p.ProcessName.StartsWith("WindowsF") orderby p.ProcessName select p;
            MyProc.MyApphWnd = processes.ElementAt(1).MainWindowHandle;
            MyProc.MyAppMainWinTitle = processes.ElementAt(1).MainWindowTitle;
            MyProc.MyAppID = processes.ElementAt(1).Id;
            MyProc.WoWhWnd = processes.ElementAt(0).MainWindowHandle;
            MyProc.WowMainWinTitle = processes.ElementAt(0).MainWindowTitle;
            MyProc.WowID = processes.ElementAt(0).Id;
            pause(350);
            SetForegroundWindow(MyProc.WoWhWnd);
            pause(850);
            SetForegroundWindow(MyProc.MyApphWnd);
        }

クエリの1つで、テキストボックスの値を使用したので、1つの定数検索と動的なオプションの検索を使用できます。間違ったことや、もっとうまくできることがある場合は、コメントしてください。ありがとうございました 。

于 2012-09-19T03:23:50.490 に答える