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
結局まだ解決していないです。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; }