FireFoxのウィンドウハンドルが取得できない件。

まず、GETCLASSNAMEを使えとのこと。
http://ir9.jp/prog/ayu/datlog/tech_win32api/1174416295/1174416295_04.html

FireFoxのウィンドウ・クラス名
http://blog.livedoor.jp/zen0102/archives/cat_86561.html

しかし、FireFoxのウィンドウ・クラス名は取得できない。
http://homepage3.nifty.com/_htom/macro/tips_main.html

プロセス名はとれないか?→とれない
http://blog.loadlimits.info/2009/09/nsis%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%88%E3%82%8B%E3%80%81%E8%B5%B7%E5%8B%95%E4%B8%AD%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%83%97%E3%83%A9/

結局まだ解決していないです。orz


以下、無駄骨C#コード

        [DllImport("Psapi.dll", SetLastError = true)]
        static extern bool EnumProcesses(
           [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U4)] [In][Out] UInt32 processIds,
             UInt32 arraySizeBytes,
             [MarshalAs(UnmanagedType.U4)] out UInt32 bytesCopied
          );

        [DllImport("kernel32.dll")]
        static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle,
           uint dwProcessId);

        [Flags]
        public enum ProcessAccessFlags : uint
        {
            All = 0x001F0FFF,
            Terminate = 0x00000001,
            CreateThread = 0x00000002,
            VMOperation = 0x00000008,
            VMRead = 0x00000010,
            VMWrite = 0x00000020,
            DupHandle = 0x00000040,
            SetInformation = 0x00000200,
            QueryInformation = 0x00000400,
            Synchronize = 0x00100000
        }

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool CloseHandle(IntPtr hObject);

        [StructLayout(LayoutKind.Sequential)]
        public struct StringBuffer
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string text;
        }

        [DllImport("psapi.dll")]
        private static extern bool EnumProcessModules(IntPtr hProcess, out IntPtr lphModule, int cb, out int lpcbNeeded);
        [DllImport("psapi.dll")]
        private static extern int GetModuleBaseName(IntPtr hProcess, IntPtr hModule, out StringBuffer lpBaseName, int nSize);

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool TerminateProcess(IntPtr hProcess, int uExitCode);

        public static bool isPname(string pname, uint pid)
        {

            UInt32 arraySize = 1024;
            UInt32 arrayBytesSize = arraySize * sizeof(UInt32);
            UInt32 processIds = new UInt32[arraySize];
            UInt32 bytesCopied;

            /*
            bool success = EnumProcesses(processIds, arrayBytesSize, out bytesCopied);

            if (!success)
            {
                return false;
            }
            if (0 == bytesCopied)
            {
                return false;
            }
            
            
            UInt32 numIdsCopied = bytesCopied >> 2;

            if (0 != (bytesCopied & 3))
            {
                UInt32 partialDwordBytes = bytesCopied & 3;

                return false;
            }
            */
            //for (UInt32 index = 0; index < numIdsCopied; index++)
            //{
                IntPtr hProcess = OpenProcess(
                    ProcessAccessFlags.QueryInformation | ProcessAccessFlags.VMRead/* | ProcessAccessFlags.Terminate*/,
                    false, pid/*processIds[index]*/);
                if (hProcess.ToInt32() != 0)
                {
                    IntPtr hMod = IntPtr.Zero;
                    int cbNeeded;
                    StringBuffer szProcessName;
                    szProcessName.text = "";

                    if (EnumProcessModules(hProcess, out hMod, Marshal.SizeOf(hMod), out cbNeeded))
                    {
                        GetModuleBaseName(hProcess, hMod, out szProcessName, Marshal.SizeOf(szProcessName));
                    }


                    if (szProcessName.text.ToLower().Contains(pname.ToLower()))
                    {
                        //TerminateProcess(hProcess, -1);
                        return true;
                    }

                    CloseHandle(hProcess);
                }
            //}
            return false;

        }

  


        public static string colFormVal = string.Empty;
        public static bool blnEndFlag = false;
        public static int fireFoxhWnd = 0;

        public static void SetWebFormValue()
        {
            //フォームに設定するデータのコレクション
            //colFormVal = text;

            //終了フラグ
            blnEndFlag = false;
            
            list.Clear();

            //トップレベルウィンドウの全てハンドル取得して、
            //最前面のWEBページのフォームにデータ設定
            int intRet = 0;

            intRet = EnumWindows(EnumWindowsProc, 0);
        }

        public static int EnumWindowsProc(int hWnd, int lParam)
        {

            // 指定された親ウィンドウに属するWEBページのフォームにデータ設定
            EnumChildWindows(hWnd, EnumChildWindowsProc, 0);
            if (blnEndFlag == true)
                return 0;
            //リターン
            return 1;

        }

        static List list = new List();
        public static int EnumChildWindowsProc(int hWnd, int lParam)
        {
            /*
            byte bytClass = new byte[255];
            String strgClass = string.Empty;

            
            GetClassName((IntPtr)hWnd, bytClass, 255);
            strgClass = StripNulls(bytClass);

            if ("MozillaWindowClass".ToLower().Equals(strgClass.ToLower()))
            {
                fireFoxhWnd = hWnd;
                blnEndFlag = true;
                return 0;
            }
            if ("MozillaUIWindowClass".ToLower().Equals(strgClass.ToLower()))
            {
                fireFoxhWnd = hWnd;
                blnEndFlag = true;
                return 0;
            }
            */

            int pid = 0;
            GetWindowThreadProcessId((IntPtr)hWnd,out pid);
            if (isPname("firefox", (uint)pid) == true)
            {
                fireFoxhWnd = hWnd;
                blnEndFlag = true;
                return 0;
            }
            else
            {
                return 1;
            }

            return 1;
        }

        //文字列からNULL文字以降をカット
        public static string StripNulls(byte bytOrg)
        {
            string strOrg = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(bytOrg);
            string[] ary = strOrg.Split(Microsoft.VisualBasic.Strings.Chr(0));
            string ret = "";
            foreach( string c in ary )
            {
                ret += c;
            }
            /*    
            int pt  = strOrg.IndexOf(Microsoft.VisualBasic.Strings.Chr(0));
                if ( pt >= 0 )
                {
                    strOrg = strOrg.Substring(0, 7);
                }
             */
                return ret;

         }