Question

According to the MSDN documentation GetWindowThreadProcessId returns "Retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window."

Here in the following program i was trying to list all the ongoing instances of firefox

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

class SpyDemo {
    private static List<IntPtr> _result = new List<IntPtr>();
    private delegate int EnumWindowCallbackFn(IntPtr hwnd, int lParam); 
    [DllImport("user32.dll")]
    private static extern int EnumWindows(EnumWindowCallbackFn x, int y);
    [DllImport("user32.dll")]
    public static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);

    private static StreamWriter writer = new StreamWriter("D:\\Log4.txt", false);

    public static void Main() {
        foreach (Process processInfo in Process.GetProcessesByName("firefox"))
        {
            //using (StreamWriter writer = new StreamWriter("D:\\Log2.txt", true)) {
                writer.WriteLine("process {0}, {1}", processInfo.ProcessName, processInfo.Id);    //writes in file
                foreach (ProcessThread threadInfo in processInfo.Threads)
                {
                    /*
                     * iterates through every thread of a process
                     */

                    //Console.WriteLine("\t{0}", threadInfo.Id);
                    writer.WriteLine("Thread Id passes: " + threadInfo.Id);
                    foreach (IntPtr item in GetWindowHandleForThread(threadInfo.Id))
                    {
                        writer.WriteLine("\t"+item);
                    }
                }
            //}
        }
        writer.Dispose();
        Console.ReadKey();
    }

    private static IntPtr[] GetWindowHandleForThread(int threadHandle) {
        _result.Clear();
        EnumWindowCallbackFn myEnumWindowCallbackFn = new EnumWindowCallbackFn(WindowEnum);
        EnumWindows(myEnumWindowCallbackFn, threadHandle);
        return _result.ToArray();
    }

    private static int WindowEnum(IntPtr hwnd, int lParam) {
        int processId = 0;
        int threadId = GetWindowThreadProcessId(hwnd, out processId);
        //using (StreamWriter writer1= new StreamWriter("D:\\Log4.txt", true)) {
            writer.WriteLine("\t hwnd: {3}, lParam: {0}, threadID: {1}, processId: {2}", lParam, threadId, processId, hwnd);
            if (threadId == lParam)
            {
                _result.Add(hwnd);
                writer.WriteLine("\t Matched");
            }
        //}
        return 1;
    }
}

But what im getting is something like this

    process firefox, 648
       Thread Id passes: 676
     hwnd: 65700, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65674, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65678, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65682, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65684, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65654, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65698, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65676, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65646, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65640, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 197400, lParam: 676, threadID: 676, processId: 648
     Matched
     hwnd: 65714, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 131294, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 131266, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 131286, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 196826, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 131326, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 131288, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 131252, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 1114854, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 131314, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 1443328, lParam: 676, threadID: 5212, processId: 2728
     hwnd: 65680, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65662, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65658, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 327846, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 984070, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 132290, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 459784, lParam: 676, threadID: 7084, processId: 2728
     hwnd: 66260, lParam: 676, threadID: 4916, processId: 4912
     hwnd: 66254, lParam: 676, threadID: 4916, processId: 4912
     hwnd: 263886, lParam: 676, threadID: 7396, processId: 2728
     hwnd: 65834, lParam: 676, threadID: 2720, processId: 2728
     hwnd: 132186, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 197734, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 1310950, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 328868, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 525444, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 328800, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 66034, lParam: 676, threadID: 5412, processId: 4904
     hwnd: 66014, lParam: 676, threadID: 5328, processId: 4828
     hwnd: 131418, lParam: 676, threadID: 5112, processId: 2728
     hwnd: 327852, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65622, lParam: 676, threadID: 4080, processId: 4048
     hwnd: 65620, lParam: 676, threadID: 4080, processId: 4048
     hwnd: 2688416, lParam: 676, threadID: 8180, processId: 3068
     hwnd: 3474992, lParam: 676, threadID: 8180, processId: 3068
     hwnd: 2426462, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 1115184, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 132196, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 1704778, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 1378230, lParam: 676, threadID: 7964, processId: 3068
     hwnd: 459528, lParam: 676, threadID: 676, processId: 648
     Matched
     hwnd: 722064, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 1967586, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 3867504, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 919188, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 2950808, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 853010, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 918728, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 1901550, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 2819496, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66086, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 262896, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66196, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66194, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66084, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 262950, lParam: 676, threadID: 6184, processId: 648
     hwnd: 196812, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 131268, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 3343794, lParam: 676, threadID: 676, processId: 648
     Matched
     hwnd: 1574684, lParam: 676, threadID: 676, processId: 648
     Matched
     hwnd: 1771210, lParam: 676, threadID: 676, processId: 648
     Matched
     hwnd: 590606, lParam: 676, threadID: 676, processId: 648
     Matched
     hwnd: 3015940, lParam: 676, threadID: 676, processId: 648
     Matched
     hwnd: 984652, lParam: 676, threadID: 7084, processId: 2728
     hwnd: 656370, lParam: 676, threadID: 7084, processId: 2728
     hwnd: 918600, lParam: 676, threadID: 7084, processId: 2728
     hwnd: 919140, lParam: 676, threadID: 7084, processId: 2728
     hwnd: 1836296, lParam: 676, threadID: 7084, processId: 2728
     hwnd: 1377222, lParam: 676, threadID: 7084, processId: 2728
     hwnd: 3998764, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 1639852, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 591316, lParam: 676, threadID: 7396, processId: 2728
     hwnd: 460376, lParam: 676, threadID: 7396, processId: 2728
     hwnd: 788020, lParam: 676, threadID: 7396, processId: 2728
     hwnd: 525704, lParam: 676, threadID: 7396, processId: 2728
     hwnd: 656886, lParam: 676, threadID: 7396, processId: 2728
     hwnd: 3343412, lParam: 676, threadID: 7396, processId: 2728
     hwnd: 721922, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 984124, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 1115058, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 853686, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 525344, lParam: 676, threadID: 7084, processId: 2728
     hwnd: 14222208, lParam: 676, threadID: 7396, processId: 2728
     hwnd: 918702, lParam: 676, threadID: 6696, processId: 2728
     hwnd: 787714, lParam: 676, threadID: 6592, processId: 2728
     hwnd: 1508200, lParam: 676, threadID: 7164, processId: 2728
     hwnd: 460024, lParam: 676, threadID: 7448, processId: 6320
     hwnd: 263336, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 3802290, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 525478, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 394078, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 394298, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 524584, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 1311552, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 132178, lParam: 676, threadID: 220, processId: 6320
     hwnd: 132244, lParam: 676, threadID: 220, processId: 6320
     hwnd: 132184, lParam: 676, threadID: 4680, processId: 6320
     hwnd: 590698, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 1770282, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 852880, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 525188, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 852866, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 852834, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 196666, lParam: 676, threadID: 5960, processId: 2728
     hwnd: 196958, lParam: 676, threadID: 5108, processId: 2728
     hwnd: 66122, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66120, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66116, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 262732, lParam: 676, threadID: 6140, processId: 6116
     hwnd: 66114, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66264, lParam: 676, threadID: 6012, processId: 4912
     hwnd: 131742, lParam: 676, threadID: 2136, processId: 4600
     hwnd: 852624, lParam: 676, threadID: 4916, processId: 4912
     hwnd: 66176, lParam: 676, threadID: 3148, processId: 4940
     hwnd: 66174, lParam: 676, threadID: 4944, processId: 4940
     hwnd: 262696, lParam: 676, threadID: 4944, processId: 4940
     hwnd: 459112, lParam: 676, threadID: 4944, processId: 4940
     hwnd: 327986, lParam: 676, threadID: 4944, processId: 4940
     hwnd: 66170, lParam: 676, threadID: 4944, processId: 4940
     hwnd: 66166, lParam: 676, threadID: 3220, processId: 4940
     hwnd: 66156, lParam: 676, threadID: 3932, processId: 5824
     hwnd: 66154, lParam: 676, threadID: 4620, processId: 4616
     hwnd: 66146, lParam: 676, threadID: 5828, processId: 5824
     hwnd: 66142, lParam: 676, threadID: 3892, processId: 5824
     hwnd: 66140, lParam: 676, threadID: 5640, processId: 5636
     hwnd: 66138, lParam: 676, threadID: 5640, processId: 5636
     hwnd: 66130, lParam: 676, threadID: 4300, processId: 5636
     hwnd: 131644, lParam: 676, threadID: 4272, processId: 5824
     hwnd: 66104, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66082, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66074, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66064, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66058, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66046, lParam: 676, threadID: 5100, processId: 2728
     hwnd: 66030, lParam: 676, threadID: 5408, processId: 4904
     hwnd: 66026, lParam: 676, threadID: 5404, processId: 4904
     hwnd: 131558, lParam: 676, threadID: 5392, processId: 4904
     hwnd: 131522, lParam: 676, threadID: 5112, processId: 2728
     hwnd: 131420, lParam: 676, threadID: 5112, processId: 2728
     hwnd: 131116, lParam: 676, threadID: 5108, processId: 2728
     hwnd: 131106, lParam: 676, threadID: 5112, processId: 2728
     hwnd: 131100, lParam: 676, threadID: 5100, processId: 2728
     hwnd: 196880, lParam: 676, threadID: 5100, processId: 2728
     hwnd: 131502, lParam: 676, threadID: 4880, processId: 4616
     hwnd: 65962, lParam: 676, threadID: 4460, processId: 4456
     hwnd: 65958, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65956, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65954, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65952, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65950, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65948, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65946, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65944, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65940, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65938, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65936, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65934, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65930, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65926, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65922, lParam: 676, threadID: 4504, processId: 4500
     hwnd: 65912, lParam: 676, threadID: 4744, processId: 4532
     hwnd: 65898, lParam: 676, threadID: 4536, processId: 4532
     hwnd: 131426, lParam: 676, threadID: 4620, processId: 4616
     hwnd: 590160, lParam: 676, threadID: 4544, processId: 4540
     hwnd: 65870, lParam: 676, threadID: 4496, processId: 2728
     hwnd: 65860, lParam: 676, threadID: 4468, processId: 2728
     hwnd: 65838, lParam: 676, threadID: 2720, processId: 2728
     hwnd: 65690, lParam: 676, threadID: 4408, processId: 2728
     hwnd: 65688, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65636, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65628, lParam: 676, threadID: 2720, processId: 2728
     hwnd: 65624, lParam: 676, threadID: 2720, processId: 2728
     hwnd: 65608, lParam: 676, threadID: 4160, processId: 3232
     hwnd: 65604, lParam: 676, threadID: 4044, processId: 3232
     hwnd: 131134, lParam: 676, threadID: 3844, processId: 4048
     hwnd: 196656, lParam: 676, threadID: 4064, processId: 4048
     hwnd: 65612, lParam: 676, threadID: 3140, processId: 3124
     hwnd: 131150, lParam: 676, threadID: 4080, processId: 4048
     hwnd: 66000, lParam: 676, threadID: 4832, processId: 4828
     hwnd: 65994, lParam: 676, threadID: 4832, processId: 4828
     hwnd: 65990, lParam: 676, threadID: 5312, processId: 4828
     hwnd: 66134, lParam: 676, threadID: 5640, processId: 5636
     hwnd: 329202, lParam: 676, threadID: 5328, processId: 4828
     hwnd: 66008, lParam: 676, threadID: 5328, processId: 4828
     hwnd: 66004, lParam: 676, threadID: 5328, processId: 4828
     hwnd: 525060, lParam: 676, threadID: 2720, processId: 2728
     hwnd: 787990, lParam: 676, threadID: 2720, processId: 2728
     hwnd: 65812, lParam: 676, threadID: 2720, processId: 2728
     hwnd: 65644, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 65638, lParam: 676, threadID: 4396, processId: 2728
     hwnd: 395040, lParam: 676, threadID: 5212, processId: 2728
     hwnd: 460500, lParam: 676, threadID: 4916, processId: 4912
     hwnd: 197276, lParam: 676, threadID: 4916, processId: 4912
     hwnd: 66036, lParam: 676, threadID: 5412, processId: 4904
     hwnd: 328464, lParam: 676, threadID: 5124, processId: 4648
     hwnd: 394012, lParam: 676, threadID: 5124, processId: 4648
     hwnd: 2491404, lParam: 676, threadID: 8180, processId: 3068
     hwnd: 2229134, lParam: 676, threadID: 8180, processId: 3068
     hwnd: 525426, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 1639246, lParam: 676, threadID: 7276, processId: 6320
     hwnd: 1180626, lParam: 676, threadID: 7964, processId: 3068
     hwnd: 1770510, lParam: 676, threadID: 676, processId: 648
     Matched
     hwnd: 590598, lParam: 676, threadID: 676, processId: 648
     Matched
     hwnd: 656434, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 787432, lParam: 676, threadID: 6380, processId: 8112
     hwnd: 66102, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 66060, lParam: 676, threadID: 5368, processId: 5364
     hwnd: 591536, lParam: 676, threadID: 7084, processId: 2728
     hwnd: 1312154, lParam: 676, threadID: 7084, processId: 2728
     hwnd: 65626, lParam: 676, threadID: 2720, processId: 2728
     hwnd: 65848, lParam: 676, threadID: 2720, processId: 2728
     hwnd: 656900, lParam: 676, threadID: 7396, processId: 2728
     hwnd: 7079376, lParam: 676, threadID: 7396, processId: 2728
     hwnd: 459588, lParam: 676, threadID: 6696, processId: 2728
     hwnd: 525680, lParam: 676, threadID: 6592, processId: 2728
     hwnd: 591206, lParam: 676, threadID: 7164, processId: 2728
     hwnd: 132182, lParam: 676, threadID: 220, processId: 6320
     hwnd: 132174, lParam: 676, threadID: 4680, processId: 6320
     hwnd: 196668, lParam: 676, threadID: 5960, processId: 2728
     hwnd: 459070, lParam: 676, threadID: 6140, processId: 6116
     hwnd: 66266, lParam: 676, threadID: 6012, processId: 4912
     hwnd: 66248, lParam: 676, threadID: 2136, processId: 4600
     hwnd: 66212, lParam: 676, threadID: 2136, processId: 4600
     hwnd: 66178, lParam: 676, threadID: 3148, processId: 4940
     hwnd: 66172, lParam: 676, threadID: 4944, processId: 4940
     hwnd: 66168, lParam: 676, threadID: 3220, processId: 4940
     hwnd: 66160, lParam: 676, threadID: 3932, processId: 5824
     hwnd: 66148, lParam: 676, threadID: 5828, processId: 5824
     hwnd: 66144, lParam: 676, threadID: 3892, processId: 5824
     hwnd: 66132, lParam: 676, threadID: 4300, processId: 5636
     hwnd: 66128, lParam: 676, threadID: 4272, processId: 5824
     hwnd: 66032, lParam: 676, threadID: 5408, processId: 4904
     hwnd: 66028, lParam: 676, threadID: 5404, processId: 4904
     hwnd: 131560, lParam: 676, threadID: 5392, processId: 4904
     hwnd: 131110, lParam: 676, threadID: 5108, processId: 2728
     hwnd: 131114, lParam: 676, threadID: 5112, processId: 2728
     hwnd: 131094, lParam: 676, threadID: 5100, processId: 2728
     hwnd: 65968, lParam: 676, threadID: 4880, processId: 4616
     hwnd: 65964, lParam: 676, threadID: 4460, processId: 4456
     hwnd: 65928, lParam: 676, threadID: 4476, processId: 4472
     hwnd: 65924, lParam: 676, threadID: 4504, processId: 4500
     hwnd: 65918, lParam: 676, threadID: 4536, processId: 4532
     hwnd: 65914, lParam: 676, threadID: 4744, processId: 4532
     hwnd: 65900, lParam: 676, threadID: 4536, processId: 4532
     hwnd: 65892, lParam: 676, threadID: 4620, processId: 4616
     hwnd: 65874, lParam: 676, threadID: 4544, processId: 4540
     hwnd: 65610, lParam: 676, threadID: 4160, processId: 3232
     hwnd: 65600, lParam: 676, threadID: 3844, processId: 4048
     hwnd: 196658, lParam: 676, threadID: 4064, processId: 4048
     hwnd: 65616, lParam: 676, threadID: 4080, processId: 4048
     hwnd: 65996, lParam: 676, threadID: 4832, processId: 4828
     hwnd: 65992, lParam: 676, threadID: 5312, processId: 4828
     hwnd: 66136, lParam: 676, threadID: 5640, processId: 5636
     hwnd: 66012, lParam: 676, threadID: 5328, processId: 4828
     hwnd: 66006, lParam: 676, threadID: 5328, processId: 4828
    197400
    459528
    3343794
    1574684
    1771210
    590606
    3015940
    1770510
    590598
Thread Id passes: 6784
     hwnd: 65700, lParam: 6784, threadID: 4396, processId: 2728
     hwnd: 65674, lParam: 6784, threadID: 4396, processId: 2728
     hwnd: 65678, lParam: 6784, threadID: 4396, processId: 2728
     hwnd: 65682, lParam: 6784, threadID: 4396, processId: 2728
     hwnd: 65684, lParam: 6784, threadID: 4396, processId: 2728
     hwnd: 65654, lParam: 6784, threadID: 4396, processId: 2728

The output contains 11545 lines. Ive pasted only a subset of it.

My question is, if firefox's processId is 648 (first line of output), how come all the subsequent processId: is not 648. Why it is something like 2728, 8112 etc.

Était-ce utile?

La solution

Because EnumWindows enumerates all top-level windows, not just windows from a specific process/thread. There is no order in returned windows handles.

Your code basically enumerates all windows. For each window, it retrieves the associated thread ID. Only if the window belongs to Firefox, the thread is a firefox thread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top