#include "StdAfx.h" #include "TSWindowsAPI.h" #include #include #include "TSMyUser32DllFuntion.h" #include "TSMyKernel32DllFuntion.h" #include "TSRuntime.h" #pragma comment ( lib, "psapi.lib" ) extern myOpenProcess my_OpenProcess; extern myScreenToClient my_ScreenToClient; extern myClientToScreen my_ClientToScreen; DWORD MyGetCursorPosRet = 0; __declspec(naked) BOOL WINAPI My_GetCursorPos(LPPOINT lpPoint) { _asm { mov edi, edi push ebp mov ebp, esp jmp MyGetCursorPosRet; } } TSWindowsAPI::TSWindowsAPI(void) { //if(TSRuntime::InitialWindowsVersion()!=4)//不是win7系统 //{ //TSRuntime::IsInitialmyUser32module=InitialMyUser32Dll(); //TSRuntime::IsInitialmykernel32module=InitialMykernel32Dll(); //if(TSRuntime::IsInitialmyUser32module==false||TSRuntime::IsInitialmykernel32module==false) // ::MessageBox(0,L"InitialMyUser32Dll失败",L"TS",0); //else // ::MessageBox(0,L"InitialMyUser32Dll成功",L"TS",0); //} //else // { // InitialMykernel32DllWIN7(); // } if (MyGetCursorPosRet == 0) { MyGetCursorPosRet = (DWORD)::GetProcAddress(::GetModuleHandle(L"user32.dll"), "GetCursorPos"); MyGetCursorPosRet += 5; } retstringlen = 0; WindowVerion = TSRuntime::InitialWindowsVersion(); IsEuemprosuccess = 0; memset(npid, 0, MAX_PATH); } TSWindowsAPI::~TSWindowsAPI(void) { } BOOL TSWindowsAPI::EnumProcessbyName(DWORD dwPID, LPCWSTR ExeName, LONG type) { if (IsEuemprosuccess == 0) { int nItem = 0; // 项计数 PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) }; HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) return FALSE; if (::Process32First(hProcessSnap, &pe32)) { do { if (type == 1) { if (wcsstr(pe32.szExeFile, ExeName) != NULL) //模糊匹配 { npid[nItem] = pe32.th32ProcessID; IsEuemprosuccess++; nItem++; } } else { if (!wcsicmp(pe32.szExeFile, ExeName)) { npid[nItem] = pe32.th32ProcessID; IsEuemprosuccess++; nItem++; } } } while (::Process32Next(hProcessSnap, &pe32)); } ::CloseHandle(hProcessSnap); if (IsEuemprosuccess > 0) return TRUE; } else { for (int i = 0; i < IsEuemprosuccess; i++) { if (dwPID == npid[i]) return TRUE; } } return FALSE; } DWORD TSWindowsAPI::FindChildWnd(HWND hchile, wchar_t* title, wchar_t* classname, wchar_t* retstring, bool isGW_OWNER, bool isVisible, wchar_t* process_name) { hchile = ::GetWindow(hchile, GW_HWNDFIRST); while (hchile != NULL) { if (isGW_OWNER) //判断是否要匹配所有者窗口为0的窗口,即顶级窗口 if (::GetWindow(hchile, GW_OWNER) != 0) { hchile = ::GetWindow(hchile, GW_HWNDNEXT); //获取下一个窗口 continue; } if (isVisible) //判断是否匹配可视窗口 if (::IsWindowVisible(hchile) == false) { hchile = ::GetWindow(hchile, GW_HWNDNEXT); //获取下一个窗口 continue; } if (title == NULL && classname == NULL) { if (process_name) { DWORD pid = 0; GetWindowThreadProcessId(hchile, &pid); if (EnumProcessbyName(pid, process_name)) { if (retstring) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, hchile); else swprintf(retstring, L"%d", hchile); } else return (DWORD)hchile; } } else { if (retstring) { int len = wcslen(retstring); if (len > 1) swprintf(retstring, L"%s,%d", retstring, hchile); else swprintf(retstring, L"%d", hchile); } else return (DWORD)hchile; } } else if (title != NULL && classname != NULL) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(hchile, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(hchile, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, classname); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(hchile, &pid); if (EnumProcessbyName(pid, process_name)) { if (retstring) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, hchile); else swprintf(retstring, L"%d", hchile); } else return (DWORD)hchile; } } else { if (retstring) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, hchile); else swprintf(retstring, L"%d", hchile); } else return (DWORD)hchile; } } } } else if (title != NULL) { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(hchile, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(hchile, &pid); if (EnumProcessbyName(pid, process_name)) { if (retstring) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, hchile); else swprintf(retstring, L"%d", hchile); } else return (DWORD)hchile; } } else { if (retstring) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, hchile); else swprintf(retstring, L"%d", hchile); } else return (DWORD)hchile; } } } } else if (classname != NULL) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(hchile, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, classname); //模糊匹配 if (strfind) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(hchile, &pid); if (EnumProcessbyName(pid, process_name)) { if (retstring) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, hchile); else swprintf(retstring, L"%d", hchile); } else return (DWORD)hchile; } } else { if (retstring) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, hchile); else swprintf(retstring, L"%d", hchile); } else return (DWORD)hchile; } } } } HWND hchilechile = ::GetWindow(hchile, GW_CHILD); if (hchilechile != NULL) { DWORD dret = FindChildWnd(hchilechile, title, classname, retstring, isGW_OWNER, isVisible, process_name); if (dret > 0) break; } hchile = ::GetWindow(hchile, GW_HWNDNEXT); //获取下一个窗口 } return 0; } //TSEnumWindow:filter整形数: 取值定义如下 // //1 : 匹配窗口标题,参数title有效 // //2 : 匹配窗口类名,参数class_name有效. // //4 : 只匹配指定父窗口的第一层孩子窗口 // //8 : 匹配所有者窗口为0的窗口,即顶级窗口 // //16 : 匹配可见的窗口 // //32 : 匹配出的窗口按照窗口打开顺序依次排列 bool TSWindowsAPI::TSEnumWindow(HWND parent, wchar_t* title, wchar_t* class_name, LONG filter, wchar_t* retstring, wchar_t* process_name) { bool bret = false; bool bZwindow = false;//匹配出的窗口按照窗口打开顺序依次排列 if (parent == 0) { parent = GetDesktopWindow(); } if (filter > 32) { bZwindow = true;//说明要排序窗口句柄 filter = filter - 32; } DWORD procpids[MAX_PATH] = { 0 }; int indexpid = 0; if (process_name)//EnumWindowByProcess { if (wcslen(process_name) < 1) return false; memset(npid, 0, MAX_PATH); IsEuemprosuccess = 0; if (EnumProcessbyName(0, process_name) == false) return false; } DWORD processpid = 0; retstringlen = 0; switch (filter) { case 0: //所有模式 { if (process_name) //EnumWindowByProcess { return false; } HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring); } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 1://1 : 匹配窗口标题,参数title有效 { if (wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } else { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring); } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 2://2 : 匹配窗口类名,参数class_name有效. { if (wcslen(class_name) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } else { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring); } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 3: //1.窗口标题+2.窗口类名 { if (wcslen(class_name) < 1 && wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } else { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring); } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 4: //4 : 只匹配指定父窗口的第一层孩子窗口 { HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring, false, false, process_name); } } } } else { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 5: //1.匹配窗口标题+//4 : 只匹配指定父窗口的第一层孩子窗口 { if (wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { if (wcsstr(WindowTitle, title)) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring, false, false, process_name); } } } } else { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { if (wcsstr(WindowTitle, title)) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 6: //2 : 匹配窗口类名+4 : 只匹配指定父窗口的第一层孩子窗口 { if (wcslen(class_name) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { if (wcsstr(WindowClassName, class_name)) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring, false, false, process_name); } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { if (wcsstr(WindowClassName, class_name)) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 7: //1.窗口标题+2.窗口类名+4 : 只匹配指定父窗口的第一层孩子窗口 { if (wcslen(class_name) < 1 && wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring, false, false, process_name); } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 8: //8 : 匹配所有者窗口为0的窗口,即顶级窗口 { HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring, true, false, process_name); } } } else { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 9: //1.窗口标题+8 : 匹配所有者窗口为0的窗口,即顶级窗口 { if (wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring, true, false, process_name); } } } else { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 10: //2.窗口类名+8 : 匹配所有者窗口为0的窗口,即顶级窗口 { if (wcslen(class_name) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring, true, false, process_name); } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 11: ////1.窗口标题+2.窗口类名+8 : 匹配所有者窗口为0的窗口,即顶级窗口 { if (wcslen(class_name) < 1 && wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return false; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring, true, false, process_name); } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 12: // //4 : 只匹配指定父窗口的第一层孩子窗口+8 : 匹配所有者窗口为0的窗口,即顶级窗口 { HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring, true, false, process_name); } } } } else { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 13: //1.窗口标题+4 : 只匹配指定父窗口的第一层孩子窗口+8 : 匹配所有者窗口为0的窗口,即顶级窗口 { if (wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring, true, false, process_name); } } } } else { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 14: //2.窗口类名+4 : 只匹配指定父窗口的第一层孩子窗口+8 : 匹配所有者窗口为0的窗口,即顶级窗口 { if (wcslen(class_name) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring, true, false, process_name); } } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 15: ////1.窗口标题+2.窗口类名+4 : 只匹配指定父窗口的第一层孩子窗口+8 : 匹配所有者窗口为0的窗口,即顶级窗口 { if (wcslen(class_name) < 1 && wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring, true, false, process_name); } } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 16://匹配可见的窗口 { parent = GetDesktopWindow(); HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p)) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring, false, true, process_name); } } } else { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring, false, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 17: //1.窗口标题+//匹配可见的窗口 { if (wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p)) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring, false, true, process_name); } } } else { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring, false, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 18: //2.窗口类名+//匹配可见的窗口 { if (wcslen(class_name) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p)) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring, false, true, process_name); } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring, false, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 19: ////1.窗口标题+2.窗口类名+匹配可见的窗口 { if (wcslen(class_name) < 1 && wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p)) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring, false, true, process_name); } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring, false, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 20: //4 : 只匹配指定父窗口的第一层孩子窗口+匹配可见的窗口 { HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p)) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring, false, true, process_name); } } } } else { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 21: //1.窗口标题+4 : 只匹配指定父窗口的第一层孩子窗口+匹配可见的窗口 { if (wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p)) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring, false, true, process_name); } } } } else { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 22://2.窗口类名+4 : 只匹配指定父窗口的第一层孩子窗口+匹配可见的窗口 { if (wcslen(class_name) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p)) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring, false, true, process_name); } } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 23://1.窗口标题+2.窗口类名+4 : 只匹配指定父窗口的第一层孩子窗口+匹配可见的窗口 { if (wcslen(class_name) < 1 && wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p)) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring, false, true, process_name); } } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 24://8 : 匹配所有者窗口为0的窗口,即顶级窗口+16.匹配可见的窗口 { HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring, true, true, process_name); } } } else { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring, true, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 25: //1.窗口标题+ 8:匹配所有者窗口为0的窗口,即顶级窗口+16.匹配可见的窗口 { if (wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring, true, true, process_name); } } } else { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring, true, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 26://2.窗口类名+ 8:匹配所有者窗口为0的窗口,即顶级窗口+16.匹配可见的窗口 { if (wcslen(class_name) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring, true, true, process_name); } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring, true, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 27://1.窗口标题+2.窗口类名+8:匹配所有者窗口为0的窗口,即顶级窗口+16.匹配可见的窗口 { if (wcslen(class_name) < 1 && wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring, true, true, process_name); } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring, true, true); } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 28: //4 : 只匹配指定父窗口的第一层孩子窗口+8:匹配所有者窗口为0的窗口,即顶级窗口+16.匹配可见的窗口 { HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, retstring, true, true, process_name); } } } } else { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 29: ////1.窗口标题+4 : 只匹配指定父窗口的第一层孩子窗口+8:匹配所有者窗口为0的窗口,即顶级窗口+16.匹配可见的窗口 { if (wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, NULL, retstring, true, true, process_name); } } } } else { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 1) { wchar_t* strfind = wcsstr(WindowTitle, title); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 30://2.窗口类名+4 : 只匹配指定父窗口的第一层孩子窗口+8:匹配所有者窗口为0的窗口,即顶级窗口+16.匹配可见的窗口 { if (wcslen(class_name) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, class_name, retstring, true, true, process_name); } } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 1) { wchar_t* strfind = wcsstr(WindowClassName, class_name); //模糊匹配 if (strfind) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } case 31: //1.窗口标题+2.窗口类名+4 : 只匹配指定父窗口的第一层孩子窗口+8:匹配所有者窗口为0的窗口,即顶级窗口+16.匹配可见的窗口 { if (wcslen(class_name) < 1 && wcslen(title) < 1) return false; HWND p = ::GetWindow(parent, GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { if (process_name)//EnumWindowByProcess { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (processpid != pid) //只匹配指定映像的所对应的第一个进程. 可能有很多同映像名的进程,只匹配第一个进程的. { if (indexpid < IsEuemprosuccess) { indexpid++; processpid = pid; memset(retstring, 0, retstringlen);//清空返回字符串 retstringlen = 0; } } if (processpid == pid) { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, title, class_name, retstring, true, true, process_name); } } } } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if (strfindclass && strfindtitle) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bret = true; } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } break; } default: return bret; } return bret; } bool TSWindowsAPI::TSEnumWindowSuper(wchar_t* spec1, LONG flag1, LONG type1, wchar_t* spec2, LONG flag2, LONG type2, LONG sort, wchar_t* retstring) { bool bret = false; wchar_t findhwnd1[MAX_PATH * 100] = { 0 }; wchar_t findhwnd2[MAX_PATH * 100] = { 0 }; bool bfindhwnd1 = false; bool bfindhwnd2 = false; retstringlen = 0; HWND parent = GetDesktopWindow(); HWND p = ::GetWindow(parent, GW_CHILD); p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (flag1 == 0)//0表示spec1的内容是标题 { wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowTitle) > 0) { if (type1 == 0)//0精确判断,1模糊判断 { if (wcscmp(spec1, WindowTitle) == 0) bfindhwnd1 = true; } else if (type1 == 1) { if (wcsstr(WindowTitle, spec1) != NULL) bfindhwnd1 = true; } } } else if (flag1 == 1)//1表示spec1的内容是程序名字 { DWORD pid = 0; ::GetWindowThreadProcessId(p, &pid); wchar_t proname[MAX_PATH] = { 0 }; GetProcesspath(pid, proname); } else if (flag1 == 2)//2表示spec1的内容是类名 { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); if (wcslen(WindowClassName) > 0) { if (type1 == 0)//0精确判断,1模糊判断 { if (wcscmp(spec1, WindowClassName) == 0) bfindhwnd1 = true; } else { if (wcsstr(WindowClassName, spec1) != NULL) bfindhwnd1 = true; } } } if (bfindhwnd1) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, p); else swprintf(retstring, L"%d", p); bfindhwnd1 = false; } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { FindChildWnd(hchile, NULL, NULL, findhwnd1); } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } return bret; } bool TSWindowsAPI::TSEnumProcess(wchar_t* name, wchar_t* retstring) { bool bret = false; retstringlen = 0; if (wcslen(name) < 1) return false; IsEuemprosuccess = 0; if (EnumProcessbyName(0, name) == true) { bret = true; for (int i = 0; i < IsEuemprosuccess; i++) { if (retstringlen == 0) retstringlen = wcslen(retstring); if (retstringlen > 1) swprintf(retstring, L"%s,%d", retstring, npid[i]); else swprintf(retstring, L"%d", npid[i]); } } return bret; } bool TSWindowsAPI::TSClientToScreen(LONG hwnd, LONG& x, LONG& y) { POINT point; if (my_ClientToScreen) { my_ClientToScreen((HWND)hwnd, &point); } else ::ClientToScreen((HWND)hwnd, &point); x = point.x; y = point.y; return true; } bool TSWindowsAPI::TSFindWindow(wchar_t* class_name, wchar_t* title, LONG& rethwnd, DWORD parent) { bool bret = false; rethwnd = 0; HWND p = NULL; if (parent == 0) p = ::GetWindow(GetDesktopWindow(), GW_CHILD); //获取桌面窗口的子窗口 else p = ::GetWindow((HWND)parent, GW_CHILD); //获取桌面窗口的子窗口 if (p == NULL) return bret; p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { if (wcslen(class_name) < 1 && wcslen(title) < 1) { rethwnd = (LONG)p; bret = true; break; } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if ((wcslen(class_name) >= 1 && strfindclass) || (wcslen(title) >= 1 && strfindtitle)) { rethwnd = (LONG)p; bret = true; break; } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } return bret; } bool TSWindowsAPI::TSFindWindowByProcess(wchar_t* class_name, wchar_t* title, LONG& rethwnd, wchar_t* process_name, DWORD Pid) { bool bret = false; rethwnd = 0; if (process_name) { if (wcslen(process_name) < 1) return false; memset(npid, 0, MAX_PATH); IsEuemprosuccess = 0; if (EnumProcessbyName(0, process_name) == false) return false; HWND p = ::GetWindow(GetDesktopWindow(), GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { DWORD pid = 0; GetWindowThreadProcessId(p, &pid); if (EnumProcessbyName(pid, process_name)) { if (wcslen(class_name) < 1 && wcslen(title) < 1) { rethwnd = (LONG)p; bret = true; break; } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if ((wcslen(class_name) >= 1 && strfindclass) || (wcslen(title) >= 1 && strfindtitle)) { rethwnd = (LONG)p; bret = true; break; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { wchar_t* classname = NULL; wchar_t* titles = NULL; if (wcslen(class_name) > 0) classname = class_name; if (wcslen(title) > 0) titles = titles; DWORD dret = FindChildWnd(hchile, titles, classname, NULL, false, false, process_name); if (dret > 0) { rethwnd = (LONG)dret; bret = true; break; } } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } } else if (Pid > 0) { HWND p = ::GetWindow(GetDesktopWindow(), GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { DWORD npid = 0; GetWindowThreadProcessId(p, &npid); if (Pid == npid) { if (wcslen(class_name) < 1 && wcslen(title) < 1) { rethwnd = (LONG)p; bret = true; break; } else { wchar_t WindowClassName[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClassName, MAX_PATH); wchar_t WindowTitle[MAX_PATH] = { 0 }; ::GetWindowText(p, WindowTitle, MAX_PATH); if (wcslen(WindowClassName) > 1 && wcslen(WindowTitle) > 1) { wchar_t* strfindclass = wcsstr(WindowClassName, class_name); //模糊匹配 wchar_t* strfindtitle = wcsstr(WindowTitle, title); //模糊匹配 if ((wcslen(class_name) >= 1 && strfindclass) || (wcslen(title) >= 1 && strfindtitle)) { rethwnd = (LONG)p; bret = true; break; } } HWND hchile = ::GetWindow(p, GW_CHILD); if (hchile != NULL) { wchar_t* classname = NULL; wchar_t* titles = NULL; if (wcslen(class_name) > 0) classname = class_name; if (wcslen(title) > 0) titles = titles; DWORD dret = FindChildWnd(hchile, titles, classname, NULL, false, false, process_name); if (dret > 0) { rethwnd = (LONG)dret; bret = true; break; } } } } } p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口 } } return bret; } bool TSWindowsAPI::TSGetClientRect(LONG hwnd, LONG& x, LONG& y, LONG& x1, LONG& y1) { bool bret = false; RECT clientrect; if (IsWindow((HWND)hwnd)) { ::GetClientRect((HWND)hwnd, &clientrect); POINT point; point.x = clientrect.left; point.y = clientrect.top; ::ClientToScreen((HWND)hwnd, &point); x = point.x; y = point.y; point.x = clientrect.right; point.y = clientrect.bottom; ::ClientToScreen((HWND)hwnd, &point); x1 = point.x; y1 = point.y; bret = true; } return bret; } bool TSWindowsAPI::TSGetClientSize(LONG hwnd, LONG& width, LONG& height) { bool bret = false; RECT clientrect; if (IsWindow((HWND)hwnd)) { ::GetClientRect((HWND)hwnd, &clientrect); width = clientrect.right - clientrect.left; height = clientrect.bottom - clientrect.top; bret = true; } return bret; } bool TSWindowsAPI::TSGetMousePointWindow(LONG& rethwnd, LONG x, LONG y) { bool bret = false; rethwnd = 0; POINT point; if ((x != -1 && y != -1)) { point.x = x; point.y = y; } else //::GetCursorPos(&point); My_GetCursorPos(&point); rethwnd = (DWORD)::WindowFromPoint(point); if (rethwnd == NULL) { HWND p = ::GetWindow(GetDesktopWindow(), GW_CHILD); //获取桌面窗口的子窗口 p = ::GetWindow(p, GW_HWNDFIRST); while (p != NULL) { if (::IsWindowVisible(p) && ::GetWindow(p, GW_OWNER) == 0) { RECT rc; ::GetWindowRect(p, &rc); if ((rc.top <= point.y) && (rc.left <= point.x) && (rc.right >= (point.x - rc.left)) && (rc.bottom >= (point.y - rc.top))) { wchar_t WindowClass[MAX_PATH] = { 0 }; ::GetClassName(p, WindowClass, MAX_PATH); //if((windowpoint.x==0||windowpoint.x= 0 && type < 16) bret = true; return bret; } bool TSWindowsAPI::TSSetWindowTransparent(LONG hwnd, LONG trans) { bool bret = false; COLORREF crKey = NULL; DWORD dwFlags = 0; BYTE bAlpha = 0; if (trans < 0) trans = 0; if (trans > 255) trans = 255; typedef bool(__stdcall* mySetLayeredWindowAttributes)( HWND hwnd, COLORREF pcrKey, BYTE pbAlpha, DWORD pdwFlags); mySetLayeredWindowAttributes obj_SetLayeredWindowAttributes = NULL; HINSTANCE hlibrary; hlibrary = LoadLibrary(_T("user32.dll")); obj_SetLayeredWindowAttributes = (mySetLayeredWindowAttributes)GetProcAddress(hlibrary, "SetLayeredWindowAttributes"); SetWindowLong((HWND)hwnd, GWL_EXSTYLE, 0x80001); bret = obj_SetLayeredWindowAttributes((HWND)hwnd, crKey, trans, 2); return bret; } bool TSWindowsAPI::TSSetClipboard(wchar_t* values) { bool bret = false; int n = ::WideCharToMultiByte(CP_ACP, 0, values, -1, NULL, 0, NULL, NULL); char* chcontent = new char[n + 1]; memset(chcontent, 0, sizeof(char) * n + 1); WideCharToMultiByte(CP_ACP, 0, values, -1, chcontent, n, NULL, NULL); if (OpenClipboard(NULL)) { //将剪贴板内容清空 EmptyClipboard(); //字节长度 int leng = strlen(chcontent) + 1; //在堆上分配可移动的内存块,程序返回一个内存句柄 HANDLE hClip = GlobalAlloc(GHND | GMEM_SHARE, leng); //定义指向字符型的指针变量 char* buff; //对分配的内存块进行加锁,将内存块句柄转化成一个指针,并将相应的引用计数器加一 buff = (char*)GlobalLock(hClip); //将用户输入的数据拷贝到指针变量中,实际上就是拷贝到分配的内存块中 memcpy(buff, chcontent, leng); buff[leng - 1] = 0; //数据写入完毕,进行解锁操作,并将引用计数器数字减一 GlobalUnlock(hClip); //将存放有数据的内存块放入剪贴板的资源管理中 HANDLE help = SetClipboardData(CF_TEXT, hClip); //关闭剪贴板,释放剪贴板资源的占用权 CloseClipboard(); //MessageBox(0,L"已将数据存入剪贴板",L"剪切扳",0); if (help != NULL) { bret = true; } else { bret = false; } } delete[] chcontent; return bret; } bool TSWindowsAPI::TSGetClipboard(wchar_t* retstr) { bool bret = false; HANDLE hClip; char* chBuffer = NULL; if (OpenClipboard(NULL)) { //从剪贴板中取出一个内存的句柄 hClip = GetClipboardData(CF_TEXT); //定义字符型指针变量用来保存内存块中的数据 //对内存块进行加锁,将内存句柄值转化为一个指针,并将内存块的引用计数器加一,内存中的数据也返回到指针型变量中 chBuffer = (char*)GlobalLock(hClip); //将数据保存到字符型变量中 //将内存块的引用计数器减一 GlobalUnlock(hClip); //关闭剪贴板,释放剪贴板资源的占用权 CloseClipboard(); } DWORD num = MultiByteToWideChar(CP_ACP, 0, chBuffer, -1, NULL, 0); wchar_t* wword = new wchar_t[num + 1];//动态的申请空间存字 memset(wword, 0, (num + 1) * sizeof(wchar_t)); //初始化动作 MultiByteToWideChar(CP_ACP, 0, chBuffer, -1, wword, num); if (num < MAX_PATH * 4 - 1) wcscpy(retstr, wword); delete[] wword; return bret; }