|
@@ -1,211 +1,236 @@
|
|
|
//#include "stdafx.h"
|
|
|
#include "WinApi.h"
|
|
|
-
|
|
|
#include <Tlhelp32.h>
|
|
|
#include <psapi.h>
|
|
|
-
|
|
|
#include <memory>
|
|
|
#pragma comment(lib, "psapi.lib")
|
|
|
|
|
|
WinApi::WinApi(void) {
|
|
|
- retstringlen = 0;
|
|
|
- WindowVerion = 0;
|
|
|
- IsEuemprosuccess = 0;
|
|
|
- memset(npid, 0, MAX_PATH);
|
|
|
+ retstringlen = 0;
|
|
|
+ WindowVerion = 0;
|
|
|
+ IsEuemprosuccess = 0;
|
|
|
+ memset(npid, 0, MAX_PATH);
|
|
|
+}
|
|
|
+
|
|
|
+WinApi::~WinApi(void)
|
|
|
+{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
-WinApi::~WinApi(void) {}
|
|
|
-
|
|
|
-BOOL WinApi::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;
|
|
|
+BOOL WinApi::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 WinApi::FindChildWnd(HWND hchile, const wchar_t *title,
|
|
|
- const wchar_t *classname, wchar_t *retstring,
|
|
|
- bool isGW_OWNER, bool isVisible,
|
|
|
- const 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;
|
|
|
+DWORD WinApi::FindChildWnd(HWND hchile, const wchar_t* title,const wchar_t* classname, wchar_t* retstring,bool isGW_OWNER, bool isVisible, const 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整形数: 取值定义如下
|
|
@@ -221,2662 +246,2736 @@ DWORD WinApi::FindChildWnd(HWND hchile, const wchar_t *title,
|
|
|
// 16 : 匹配可见的窗口
|
|
|
//
|
|
|
// 32 : 匹配出的窗口按照窗口打开顺序依次排列
|
|
|
-bool WinApi::EnumWindow(HWND parent, const wchar_t *title,
|
|
|
- const wchar_t *class_name, LONG filter,
|
|
|
- wchar_t *retstring, const 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 WinApi::EnumWindow(HWND parent, const wchar_t* title,const wchar_t* class_name, LONG filter,wchar_t* retstring, const 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 WinApi::EnumWindowSuper(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 WinApi::EnumWindowSuper(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 WinApi::EnumProcess(const 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 WinApi::EnumProcess(const 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 WinApi::ClientToScreen(LONG hwnd, LONG &x, LONG &y) {
|
|
|
- POINT point;
|
|
|
|
|
|
- ::ClientToScreen((HWND)hwnd, &point);
|
|
|
+bool WinApi::ClientToScreen(LONG hwnd, LONG& x, LONG& y)
|
|
|
+{
|
|
|
+ POINT point;
|
|
|
+ ::ClientToScreen((HWND)hwnd, &point);
|
|
|
|
|
|
- x = point.x;
|
|
|
- y = point.y;
|
|
|
+ x = point.x;
|
|
|
+ y = point.y;
|
|
|
|
|
|
- return true;
|
|
|
+ return true;
|
|
|
}
|
|
|
-long WinApi::FindWindow(const wchar_t *class_name, const wchar_t *title) {
|
|
|
- if (class_name[0] == L'\0') class_name = nullptr;
|
|
|
- if (title[0] == L'\0') title = nullptr;
|
|
|
- return (LONG)::FindWindowW(class_name, title);
|
|
|
+
|
|
|
+long WinApi::FindWindow(const wchar_t* class_name, const wchar_t* title)
|
|
|
+{
|
|
|
+ if (class_name[0] == L'\0') class_name = nullptr;
|
|
|
+ if (title[0] == L'\0') title = nullptr;
|
|
|
+ return (LONG)::FindWindowW(class_name, title);
|
|
|
}
|
|
|
|
|
|
-long WinApi::FindWindowEx(long parent, const wchar_t *class_name,
|
|
|
- const wchar_t *title) {
|
|
|
- if (class_name[0] == L'\0') class_name = nullptr;
|
|
|
- if (title[0] == L'\0') title = nullptr;
|
|
|
- return (long)::FindWindowExW((HWND)parent, NULL, class_name, title);
|
|
|
+long WinApi::FindWindowEx(long parent, const wchar_t* class_name,const wchar_t* title)
|
|
|
+{
|
|
|
+ if (class_name[0] == L'\0') class_name = nullptr;
|
|
|
+ if (title[0] == L'\0') title = nullptr;
|
|
|
+ return (long)::FindWindowExW((HWND)parent, NULL, class_name, title);
|
|
|
}
|
|
|
|
|
|
-bool WinApi::FindWindowByProcess(const wchar_t *class_name,
|
|
|
- const wchar_t *title, LONG &rethwnd,
|
|
|
- const 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) {
|
|
|
- const wchar_t *classname = NULL;
|
|
|
- const 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) {
|
|
|
- const wchar_t *classname = NULL;
|
|
|
- const 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 WinApi::FindWindowByProcess(const wchar_t* class_name, const wchar_t* title, LONG& rethwnd, const 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) {
|
|
|
+ const wchar_t* classname = NULL;
|
|
|
+ const 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) {
|
|
|
+ const wchar_t* classname = NULL;
|
|
|
+ const 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 WinApi::GetClientRect(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 WinApi::GetClientRect(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 WinApi::GetClientSize(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 WinApi::GetClientSize(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 WinApi::GetMousePointWindow(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);
|
|
|
- }
|
|
|
- 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<rc.left)&&wcscmp(WindowClass,L"CabinetWClass")!=0)
|
|
|
- // //IE框窗体排除在外
|
|
|
- if (wcscmp(WindowClass, L"CabinetWClass") != 0) // IE框窗体排除在外
|
|
|
- {
|
|
|
- rethwnd = (DWORD)p;
|
|
|
- bret = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口
|
|
|
- }
|
|
|
- } else
|
|
|
- bret = true;
|
|
|
-
|
|
|
- return bret;
|
|
|
+
|
|
|
+bool WinApi::GetMousePointWindow(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);
|
|
|
+ }
|
|
|
+ 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<rc.left)&&wcscmp(WindowClass,L"CabinetWClass")!=0)
|
|
|
+ // //IE框窗体排除在外
|
|
|
+ if (wcscmp(WindowClass, L"CabinetWClass") != 0) // IE框窗体排除在外
|
|
|
+ {
|
|
|
+ rethwnd = (DWORD)p;
|
|
|
+ bret = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ p = ::GetWindow(p, GW_HWNDNEXT); //获取下一个窗口
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ bret = true;
|
|
|
+
|
|
|
+ return bret;
|
|
|
}
|
|
|
|
|
|
int WinApi::GetProcessNumber() //获取CPU个数
|
|
|
{
|
|
|
- SYSTEM_INFO info;
|
|
|
- GetSystemInfo(&info);
|
|
|
- return (int)info.dwNumberOfProcessors;
|
|
|
+ SYSTEM_INFO info;
|
|
|
+ GetSystemInfo(&info);
|
|
|
+ return (int)info.dwNumberOfProcessors;
|
|
|
}
|
|
|
|
|
|
// 时间格式转换
|
|
|
-__int64 WinApi::FileTimeToInt64(const FILETIME &time) {
|
|
|
- ULARGE_INTEGER tt;
|
|
|
- tt.LowPart = time.dwLowDateTime;
|
|
|
- tt.HighPart = time.dwHighDateTime;
|
|
|
- return (tt.QuadPart);
|
|
|
+__int64 WinApi::FileTimeToInt64(const FILETIME& time)
|
|
|
+{
|
|
|
+ ULARGE_INTEGER tt;
|
|
|
+ tt.LowPart = time.dwLowDateTime;
|
|
|
+ tt.HighPart = time.dwHighDateTime;
|
|
|
+ return (tt.QuadPart);
|
|
|
}
|
|
|
|
|
|
double WinApi::get_cpu_usage(DWORD ProcessID) //获取指定进程CPU使用率
|
|
|
{
|
|
|
- // cpu数量
|
|
|
- static int processor_count_ = -1;
|
|
|
- //上一次的时间
|
|
|
- static __int64 last_time_ = 0;
|
|
|
- static __int64 last_system_time_ = 0;
|
|
|
-
|
|
|
- FILETIME now;
|
|
|
- FILETIME creation_time;
|
|
|
- FILETIME exit_time;
|
|
|
- FILETIME kernel_time;
|
|
|
- FILETIME user_time;
|
|
|
- __int64 system_time;
|
|
|
- __int64 time;
|
|
|
- // __int64 system_time_delta;
|
|
|
- // __int64 time_delta;
|
|
|
-
|
|
|
- double cpu = -1;
|
|
|
-
|
|
|
- if (processor_count_ == -1) {
|
|
|
- processor_count_ = GetProcessNumber();
|
|
|
- }
|
|
|
-
|
|
|
- GetSystemTimeAsFileTime(&now);
|
|
|
-
|
|
|
- // HANDLE hProcess =
|
|
|
- // OpenProcess(PROCESS_QUERY_INFORMATION/*PROCESS_ALL_ACCESS*/, false,
|
|
|
- // ProcessID);
|
|
|
- HANDLE hProcess = NULL;
|
|
|
-
|
|
|
- hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
|
|
|
- ProcessID);
|
|
|
-
|
|
|
- if (!hProcess) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- if (!GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time,
|
|
|
- &user_time)) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- system_time = (FileTimeToInt64(kernel_time) + FileTimeToInt64(user_time)) /
|
|
|
- processor_count_; // CPU使用时间
|
|
|
- time = FileTimeToInt64(now); //现在的时间
|
|
|
-
|
|
|
- last_system_time_ = system_time;
|
|
|
- last_time_ = time;
|
|
|
- CloseHandle(hProcess);
|
|
|
-
|
|
|
- Sleep(1000);
|
|
|
-
|
|
|
- // hProcess = OpenProcess(PROCESS_QUERY_INFORMATION/*PROCESS_ALL_ACCESS*/,
|
|
|
- // false, ProcessID);
|
|
|
-
|
|
|
- hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
|
|
|
- ProcessID);
|
|
|
-
|
|
|
- if (!hProcess) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- if (!GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time,
|
|
|
- &user_time)) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- GetSystemTimeAsFileTime(&now);
|
|
|
- system_time = (FileTimeToInt64(kernel_time) + FileTimeToInt64(user_time)) /
|
|
|
- processor_count_; // CPU使用时间
|
|
|
- time = FileTimeToInt64(now); //现在的时间
|
|
|
-
|
|
|
- CloseHandle(hProcess);
|
|
|
-
|
|
|
- cpu = ((double)(system_time - last_system_time_) /
|
|
|
- (double)(time - last_time_)) *
|
|
|
- 100;
|
|
|
- return cpu;
|
|
|
+ // cpu数量
|
|
|
+ static int processor_count_ = -1;
|
|
|
+ //上一次的时间
|
|
|
+ static __int64 last_time_ = 0;
|
|
|
+ static __int64 last_system_time_ = 0;
|
|
|
+
|
|
|
+ FILETIME now;
|
|
|
+ FILETIME creation_time;
|
|
|
+ FILETIME exit_time;
|
|
|
+ FILETIME kernel_time;
|
|
|
+ FILETIME user_time;
|
|
|
+ __int64 system_time;
|
|
|
+ __int64 time;
|
|
|
+ // __int64 system_time_delta;
|
|
|
+ // __int64 time_delta;
|
|
|
+
|
|
|
+ double cpu = -1;
|
|
|
+ if (processor_count_ == -1) {
|
|
|
+ processor_count_ = GetProcessNumber();
|
|
|
+ }
|
|
|
+
|
|
|
+ GetSystemTimeAsFileTime(&now);
|
|
|
+
|
|
|
+ // HANDLE hProcess =
|
|
|
+ // OpenProcess(PROCESS_QUERY_INFORMATION/*PROCESS_ALL_ACCESS*/, false,
|
|
|
+ // ProcessID);
|
|
|
+ HANDLE hProcess = NULL;
|
|
|
+ hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
|
|
|
+ ProcessID);
|
|
|
+
|
|
|
+ if (!hProcess) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time,
|
|
|
+ &user_time)) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ system_time = (FileTimeToInt64(kernel_time) + FileTimeToInt64(user_time)) /
|
|
|
+ processor_count_; // CPU使用时间
|
|
|
+ time = FileTimeToInt64(now); //现在的时间
|
|
|
+
|
|
|
+ last_system_time_ = system_time;
|
|
|
+ last_time_ = time;
|
|
|
+ CloseHandle(hProcess);
|
|
|
+
|
|
|
+ Sleep(1000);
|
|
|
+
|
|
|
+ // hProcess = OpenProcess(PROCESS_QUERY_INFORMATION/*PROCESS_ALL_ACCESS*/,
|
|
|
+ // false, ProcessID);
|
|
|
+
|
|
|
+ hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
|
|
|
+ ProcessID);
|
|
|
+
|
|
|
+ if (!hProcess) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ if (!GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time,
|
|
|
+ &user_time)) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ GetSystemTimeAsFileTime(&now);
|
|
|
+ system_time = (FileTimeToInt64(kernel_time) + FileTimeToInt64(user_time)) /
|
|
|
+ processor_count_; // CPU使用时间
|
|
|
+ time = FileTimeToInt64(now); //现在的时间
|
|
|
+
|
|
|
+ CloseHandle(hProcess);
|
|
|
+
|
|
|
+ cpu = ((double)(system_time - last_system_time_) /
|
|
|
+ (double)(time - last_time_)) *
|
|
|
+ 100;
|
|
|
+ return cpu;
|
|
|
}
|
|
|
|
|
|
//或者指定进程内存使用率
|
|
|
-DWORD WinApi::GetMemoryInfo(DWORD ProcessID) {
|
|
|
- PROCESS_MEMORY_COUNTERS pmc;
|
|
|
- DWORD memoryInK = 0;
|
|
|
- HANDLE hProcess = NULL;
|
|
|
+DWORD WinApi::GetMemoryInfo(DWORD ProcessID)
|
|
|
+{
|
|
|
+ PROCESS_MEMORY_COUNTERS pmc;
|
|
|
+ DWORD memoryInK = 0;
|
|
|
+ HANDLE hProcess = NULL;
|
|
|
|
|
|
- hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
|
|
|
- ProcessID);
|
|
|
+ hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
|
|
|
+ ProcessID);
|
|
|
|
|
|
- if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc))) {
|
|
|
- // memoryInK = pmc.WorkingSetSize/1024; //单位为k
|
|
|
- memoryInK = pmc.WorkingSetSize;
|
|
|
- }
|
|
|
+ if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc))) {
|
|
|
+ // memoryInK = pmc.WorkingSetSize/1024; //单位为k
|
|
|
+ memoryInK = pmc.WorkingSetSize;
|
|
|
+ }
|
|
|
|
|
|
- CloseHandle(hProcess);
|
|
|
- return memoryInK;
|
|
|
+ CloseHandle(hProcess);
|
|
|
+ return memoryInK;
|
|
|
}
|
|
|
|
|
|
-bool WinApi::GetProcessInfo(LONG pid, wchar_t *retstring) {
|
|
|
- bool bret = false;
|
|
|
- wchar_t process_name[MAX_PATH] = {0};
|
|
|
- wchar_t process_path[MAX_PATH] = {0};
|
|
|
- DWORD cpu = 0;
|
|
|
- DWORD meminfo = 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 (pe32.th32ProcessID == pid) {
|
|
|
- wcscpy(process_name, pe32.szExeFile);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- } while (::Process32Next(hProcessSnap, &pe32));
|
|
|
- }
|
|
|
- ::CloseHandle(hProcessSnap);
|
|
|
- if (wcslen(process_name) < 1) return bret;
|
|
|
-
|
|
|
- // TSRuntime::GetRemoteModulePath(process_name, pid, process_path);
|
|
|
- cpu = (DWORD)get_cpu_usage(pid);
|
|
|
- meminfo = (DWORD)GetMemoryInfo(pid);
|
|
|
-
|
|
|
- swprintf(retstring, L"%s|%s|%d|%d", process_name, process_path, cpu, meminfo);
|
|
|
-
|
|
|
- return bret;
|
|
|
+bool WinApi::GetProcessInfo(LONG pid, wchar_t* retstring)
|
|
|
+{
|
|
|
+ bool bret = false;
|
|
|
+ wchar_t process_name[MAX_PATH] = { 0 };
|
|
|
+ wchar_t process_path[MAX_PATH] = { 0 };
|
|
|
+ DWORD cpu = 0;
|
|
|
+ DWORD meminfo = 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 (pe32.th32ProcessID == pid) {
|
|
|
+ wcscpy(process_name, pe32.szExeFile);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ } while (::Process32Next(hProcessSnap, &pe32));
|
|
|
+ }
|
|
|
+ ::CloseHandle(hProcessSnap);
|
|
|
+ if (wcslen(process_name) < 1) return bret;
|
|
|
+
|
|
|
+ // TSRuntime::GetRemoteModulePath(process_name, pid, process_path);
|
|
|
+ cpu = (DWORD)get_cpu_usage(pid);
|
|
|
+ meminfo = (DWORD)GetMemoryInfo(pid);
|
|
|
+
|
|
|
+ swprintf(retstring, L"%s|%s|%d|%d", process_name, process_path, cpu, meminfo);
|
|
|
+
|
|
|
+ return bret;
|
|
|
}
|
|
|
-bool WinApi::GetProcesspath(DWORD ProcessID, wchar_t *process_path) {
|
|
|
- HANDLE hProcess = NULL;
|
|
|
|
|
|
- hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
|
|
|
- ProcessID);
|
|
|
+bool WinApi::GetProcesspath(DWORD ProcessID, wchar_t* process_path)
|
|
|
+{
|
|
|
+ HANDLE hProcess = NULL;
|
|
|
|
|
|
- HMODULE hMods = NULL;
|
|
|
- DWORD cbNeededModule = 0;
|
|
|
- EnumProcessModules(hProcess, &hMods, sizeof(hMods), &cbNeededModule);
|
|
|
- GetModuleFileNameEx(hProcess, hMods, process_path, MAX_PATH);
|
|
|
+ hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,
|
|
|
+ ProcessID);
|
|
|
|
|
|
- return true;
|
|
|
-}
|
|
|
-bool WinApi::GetWindow(LONG hwnd, LONG flag, LONG &rethwnd) {
|
|
|
- bool bret = false;
|
|
|
- rethwnd = 0;
|
|
|
- HWND wnd = (HWND)hwnd;
|
|
|
- if (IsWindow(wnd) == false) return bret;
|
|
|
- DWORD type = -1;
|
|
|
- if (flag == 0) // 0:获取父窗口
|
|
|
- rethwnd = (LONG)::GetParent(wnd);
|
|
|
- else if (flag == 1) //获取第一个儿子窗口
|
|
|
- type = GW_CHILD;
|
|
|
- else if (flag == 2) //获取First 窗口
|
|
|
- type = GW_HWNDFIRST;
|
|
|
- else if (flag == 3) //获取Last窗口
|
|
|
- type = GW_HWNDLAST;
|
|
|
- else if (flag == 4) //获取下一个窗口
|
|
|
- type = GW_HWNDNEXT;
|
|
|
- else if (flag == 5) //获取上一个窗口
|
|
|
- type = GW_HWNDPREV;
|
|
|
- else if (flag == 6) //获取拥有者窗口
|
|
|
- type = GW_OWNER;
|
|
|
- else if (flag == 7) //获取顶层窗口
|
|
|
- {
|
|
|
- // rethwnd = (LONG)::GetForegroundWindow();
|
|
|
- HWND next = NULL, current = (HWND)hwnd;
|
|
|
- while (next = ::GetParent(current)) current = next;
|
|
|
- rethwnd = (long)current;
|
|
|
- return ::IsWindow(current);
|
|
|
- }
|
|
|
-
|
|
|
- if (type != -1) rethwnd = (LONG)::GetWindow(wnd, (UINT)type);
|
|
|
-
|
|
|
- if (rethwnd != 0) bret = true;
|
|
|
-
|
|
|
- return bret;
|
|
|
-}
|
|
|
+ HMODULE hMods = NULL;
|
|
|
+ DWORD cbNeededModule = 0;
|
|
|
+ EnumProcessModules(hProcess, &hMods, sizeof(hMods), &cbNeededModule);
|
|
|
+ GetModuleFileNameEx(hProcess, hMods, process_path, MAX_PATH);
|
|
|
|
|
|
-bool WinApi::GetWindowState(LONG hwnd, LONG flag) {
|
|
|
- bool bret = false;
|
|
|
- HWND wnd = (HWND)hwnd;
|
|
|
- if (flag == 0) // 0://判断窗口是否存在
|
|
|
- bret = ::IsWindow(wnd);
|
|
|
- else if (flag == 1) //判断窗口是否处于激活
|
|
|
- {
|
|
|
- if (::GetActiveWindow() == wnd) bret = true;
|
|
|
- } else if (flag == 2) // 2 : 判断窗口是否可见
|
|
|
- bret = ::IsWindowVisible(wnd);
|
|
|
- else if (flag == 3) // 3 : 判断窗口是否最小化
|
|
|
- bret = ::IsIconic(wnd);
|
|
|
- else if (flag == 4) // 4 : 判断窗口是否最大化
|
|
|
- bret = ::IsZoomed(wnd);
|
|
|
- else if (flag == 5) // 5 : 判断窗口是否置顶
|
|
|
- {
|
|
|
- if (::GetForegroundWindow() == wnd) bret = true;
|
|
|
- } else if (flag == 6) // 6 : 判断窗口是否无响应
|
|
|
- bret = ::IsHungAppWindow(wnd);
|
|
|
- else if (flag == 7) //判断窗口是否可用(灰色为不可用)
|
|
|
- bret = ::IsWindowEnabled(wnd);
|
|
|
-
|
|
|
- return bret;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
-bool WinApi::SendPaste(LONG hwnd) {
|
|
|
- bool bret = true;
|
|
|
- HANDLE hClip;
|
|
|
- char *chBuffer = NULL;
|
|
|
- if (OpenClipboard(NULL)) {
|
|
|
- //从剪贴板中取出一个内存的句柄
|
|
|
- hClip = GetClipboardData(CF_TEXT);
|
|
|
- //定义字符型指针变量用来保存内存块中的数据
|
|
|
- //对内存块进行加锁,将内存句柄值转化为一个指针,并将内存块的引用计数器加一,内存中的数据也返回到指针型变量中
|
|
|
- chBuffer = (char *)GlobalLock(hClip);
|
|
|
- //将数据保存到字符型变量中
|
|
|
- //将内存块的引用计数器减一
|
|
|
- GlobalUnlock(hClip);
|
|
|
- //关闭剪贴板,释放剪贴板资源的占用权
|
|
|
- CloseClipboard();
|
|
|
- }
|
|
|
- // anscii 转 unicode
|
|
|
- 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);
|
|
|
-
|
|
|
- int len = wcslen(wword);
|
|
|
- // MessageBoxA(NULL,tts,tts,NULL);
|
|
|
- for (int i = 0; i < len; i++) {
|
|
|
- ::SendMessage((HWND)hwnd, WM_CHAR, (WPARAM)wword[i], (LPARAM)1);
|
|
|
- Sleep(10);
|
|
|
- }
|
|
|
- delete[] wword;
|
|
|
-
|
|
|
- return bret;
|
|
|
+bool WinApi::GetWindow(LONG hwnd, LONG flag, LONG& rethwnd)
|
|
|
+{
|
|
|
+ bool bret = false;
|
|
|
+ rethwnd = 0;
|
|
|
+ HWND wnd = (HWND)hwnd;
|
|
|
+ if (IsWindow(wnd) == false) return bret;
|
|
|
+ DWORD type = -1;
|
|
|
+ if (flag == 0) // 0:获取父窗口
|
|
|
+ rethwnd = (LONG)::GetParent(wnd);
|
|
|
+ else if (flag == 1) //获取第一个儿子窗口
|
|
|
+ type = GW_CHILD;
|
|
|
+ else if (flag == 2) //获取First 窗口
|
|
|
+ type = GW_HWNDFIRST;
|
|
|
+ else if (flag == 3) //获取Last窗口
|
|
|
+ type = GW_HWNDLAST;
|
|
|
+ else if (flag == 4) //获取下一个窗口
|
|
|
+ type = GW_HWNDNEXT;
|
|
|
+ else if (flag == 5) //获取上一个窗口
|
|
|
+ type = GW_HWNDPREV;
|
|
|
+ else if (flag == 6) //获取拥有者窗口
|
|
|
+ type = GW_OWNER;
|
|
|
+ else if (flag == 7) //获取顶层窗口
|
|
|
+ {
|
|
|
+ // rethwnd = (LONG)::GetForegroundWindow();
|
|
|
+ HWND next = NULL, current = (HWND)hwnd;
|
|
|
+ while (next = ::GetParent(current)) current = next;
|
|
|
+ rethwnd = (long)current;
|
|
|
+ return ::IsWindow(current);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (type != -1) rethwnd = (LONG)::GetWindow(wnd, (UINT)type);
|
|
|
+
|
|
|
+ if (rethwnd != 0) bret = true;
|
|
|
+
|
|
|
+ return bret;
|
|
|
}
|
|
|
|
|
|
-bool WinApi::SetWindowSize(LONG hwnd, LONG width, LONG hight, int type) {
|
|
|
- bool bret = false;
|
|
|
- if (type == 0) // SetClientSize
|
|
|
- {
|
|
|
- RECT rectProgram, rectClient;
|
|
|
- HWND hWnd = (HWND)hwnd;
|
|
|
- ::GetWindowRect(hWnd, &rectProgram); //获得程序窗口位于屏幕坐标
|
|
|
- ::GetClientRect(hWnd, &rectClient); //获得客户区坐标
|
|
|
- //非客户区宽,高
|
|
|
- int nWidth = rectProgram.right - rectProgram.left -
|
|
|
- (rectClient.right - rectClient.left);
|
|
|
- int nHeiht = rectProgram.bottom - rectProgram.top -
|
|
|
- (rectClient.bottom - rectClient.top);
|
|
|
- nWidth += width;
|
|
|
- nHeiht += hight;
|
|
|
- rectProgram.right = nWidth;
|
|
|
- rectProgram.bottom = nHeiht;
|
|
|
- int showToScreenx =
|
|
|
- GetSystemMetrics(SM_CXSCREEN) / 2 - nWidth / 2; //居中处理
|
|
|
- int showToScreeny = GetSystemMetrics(SM_CYSCREEN) / 2 - nHeiht / 2;
|
|
|
- bret = ::MoveWindow(hWnd, showToScreenx, showToScreeny, rectProgram.right,
|
|
|
- rectProgram.bottom, false);
|
|
|
- } else // SetWindowSize
|
|
|
- {
|
|
|
- RECT rectClient;
|
|
|
- HWND hWnd = (HWND)hwnd;
|
|
|
- ::GetWindowRect(hWnd, &rectClient); //获得程序窗口位于屏幕坐标
|
|
|
- bret = ::MoveWindow(hWnd, rectClient.left, rectClient.top, width, hight,
|
|
|
- false);
|
|
|
- }
|
|
|
- return bret;
|
|
|
+bool WinApi::GetWindowState(LONG hwnd, LONG flag)
|
|
|
+{
|
|
|
+ bool bret = false;
|
|
|
+ HWND wnd = (HWND)hwnd;
|
|
|
+ if (flag == 0) // 0://判断窗口是否存在
|
|
|
+ bret = ::IsWindow(wnd);
|
|
|
+ else if (flag == 1) //判断窗口是否处于激活
|
|
|
+ {
|
|
|
+ if (::GetActiveWindow() == wnd) bret = true;
|
|
|
+ }
|
|
|
+ else if (flag == 2) // 2 : 判断窗口是否可见
|
|
|
+ bret = ::IsWindowVisible(wnd);
|
|
|
+ else if (flag == 3) // 3 : 判断窗口是否最小化
|
|
|
+ bret = ::IsIconic(wnd);
|
|
|
+ else if (flag == 4) // 4 : 判断窗口是否最大化
|
|
|
+ bret = ::IsZoomed(wnd);
|
|
|
+ else if (flag == 5) // 5 : 判断窗口是否置顶
|
|
|
+ {
|
|
|
+ if (::GetForegroundWindow() == wnd) bret = true;
|
|
|
+ }
|
|
|
+ else if (flag == 6) // 6 : 判断窗口是否无响应
|
|
|
+ bret = ::IsHungAppWindow(wnd);
|
|
|
+ else if (flag == 7) //判断窗口是否可用(灰色为不可用)
|
|
|
+ bret = ::IsWindowEnabled(wnd);
|
|
|
+
|
|
|
+ return bret;
|
|
|
}
|
|
|
|
|
|
-bool WinApi::SetWindowState(LONG hwnd, LONG flag, LONG rethwnd) {
|
|
|
- bool bret = false;
|
|
|
- HWND hWnd = (HWND)hwnd;
|
|
|
- if (IsWindow(hWnd) == false) return bret;
|
|
|
- int type = -1;
|
|
|
- type = flag;
|
|
|
- if (flag == 0) //关闭指定窗口
|
|
|
- ::SendMessage(hWnd, WM_CLOSE, 0, 0);
|
|
|
- else if (flag == 1) //激活指定窗口
|
|
|
- {
|
|
|
- ::ShowWindow(hWnd, SW_SHOW);
|
|
|
- ::SetForegroundWindow(hWnd);
|
|
|
- } else if (flag == 2) //最小化指定窗口,但不激活
|
|
|
- ::ShowWindow(hWnd, SW_SHOWMINNOACTIVE);
|
|
|
- else if (flag == 3) //最小化指定窗口,并释放内存,但同时也会激活窗口
|
|
|
- ::ShowWindow(hWnd, SW_SHOWMINIMIZED);
|
|
|
- else if (flag == 4) //最大化指定窗口,同时激活窗口.
|
|
|
- ::ShowWindow(hWnd, SW_SHOWMAXIMIZED);
|
|
|
- else if (flag == 5) //恢复指定窗口 ,但不激活
|
|
|
- ::ShowWindow(hWnd, SW_SHOWNOACTIVATE);
|
|
|
- else if (flag == 6) //隐藏指定窗口
|
|
|
- ::ShowWindow(hWnd, SW_HIDE);
|
|
|
- else if (flag == 7) //显示指定窗口
|
|
|
- {
|
|
|
- ::ShowWindow(hWnd, SW_SHOW);
|
|
|
- ::SetForegroundWindow(hWnd);
|
|
|
- } else if (flag == 8) //置顶指定窗口
|
|
|
- ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0,
|
|
|
- SWP_NOMOVE | SWP_NOSIZE); //窗口置顶
|
|
|
- else if (flag == 9) // 9 : 取消置顶指定窗口
|
|
|
- ::SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
|
|
- else if (flag == 10) //禁止指定窗口
|
|
|
- ::EnableWindow(hWnd, false);
|
|
|
- else if (flag == 11) //取消禁止指定窗口
|
|
|
- ::EnableWindow(hWnd, true);
|
|
|
- else if (flag == 12) // 12 : 恢复并激活指定窗口
|
|
|
- ::ShowWindow(hWnd, SW_RESTORE);
|
|
|
- else if (flag == 13) // 13 : 强制结束窗口所在进程.
|
|
|
- {
|
|
|
- DWORD pid = 0;
|
|
|
- ::GetWindowThreadProcessId(hWnd, &pid);
|
|
|
- // TSRuntime::EnablePrivilege(L"SeDebugPrivilege", true);
|
|
|
- HANDLE hprocess = NULL;
|
|
|
-
|
|
|
- hprocess = ::OpenProcess(PROCESS_ALL_ACCESS, false, pid);
|
|
|
-
|
|
|
- ::TerminateProcess(hprocess, 0);
|
|
|
- } else if (flag == 14) // 14 : 闪烁指定的窗口
|
|
|
- {
|
|
|
- FLASHWINFO fInfo;
|
|
|
- fInfo.cbSize = sizeof(FLASHWINFO);
|
|
|
- fInfo.dwFlags =
|
|
|
- FLASHW_ALL |
|
|
|
- FLASHW_TIMERNOFG; //这里是闪动窗标题和任务栏按钮,直到用户激活窗体
|
|
|
- fInfo.dwTimeout = 0;
|
|
|
- fInfo.hwnd = hWnd;
|
|
|
- fInfo.uCount = 0xffffff;
|
|
|
- FlashWindowEx(&fInfo);
|
|
|
- } else if (flag == 15) //使指定的窗口获取输入焦点
|
|
|
- {
|
|
|
- ::ShowWindow(hWnd, SW_SHOW);
|
|
|
- ::SetFocus(hWnd);
|
|
|
- }
|
|
|
-
|
|
|
- if (type >= 0 && type < 16) bret = true;
|
|
|
-
|
|
|
- return bret;
|
|
|
+bool WinApi::SendPaste(LONG hwnd)
|
|
|
+{
|
|
|
+ bool bret = true;
|
|
|
+ HANDLE hClip;
|
|
|
+ char* chBuffer = NULL;
|
|
|
+ if (OpenClipboard(NULL)) {
|
|
|
+ //从剪贴板中取出一个内存的句柄
|
|
|
+ hClip = GetClipboardData(CF_TEXT);
|
|
|
+ //定义字符型指针变量用来保存内存块中的数据
|
|
|
+ //对内存块进行加锁,将内存句柄值转化为一个指针,并将内存块的引用计数器加一,内存中的数据也返回到指针型变量中
|
|
|
+ chBuffer = (char*)GlobalLock(hClip);
|
|
|
+ //将数据保存到字符型变量中
|
|
|
+ //将内存块的引用计数器减一
|
|
|
+ GlobalUnlock(hClip);
|
|
|
+ //关闭剪贴板,释放剪贴板资源的占用权
|
|
|
+ CloseClipboard();
|
|
|
+ }
|
|
|
+ // anscii 转 unicode
|
|
|
+ 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);
|
|
|
+
|
|
|
+ int len = wcslen(wword);
|
|
|
+ // MessageBoxA(NULL,tts,tts,NULL);
|
|
|
+ for (int i = 0; i < len; i++) {
|
|
|
+ ::SendMessage((HWND)hwnd, WM_CHAR, (WPARAM)wword[i], (LPARAM)1);
|
|
|
+ Sleep(10);
|
|
|
+ }
|
|
|
+ delete[] wword;
|
|
|
+
|
|
|
+ return bret;
|
|
|
}
|
|
|
|
|
|
-bool WinApi::SetWindowTransparent(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 = SetLayeredWindowAttributes((HWND)hwnd, crKey, trans, 2);
|
|
|
-
|
|
|
- return bret;
|
|
|
+bool WinApi::SetWindowSize(LONG hwnd, LONG width, LONG hight, int type)
|
|
|
+{
|
|
|
+ bool bret = false;
|
|
|
+ if (type == 0) // SetClientSize
|
|
|
+ {
|
|
|
+ RECT rectProgram, rectClient;
|
|
|
+ HWND hWnd = (HWND)hwnd;
|
|
|
+ ::GetWindowRect(hWnd, &rectProgram); //获得程序窗口位于屏幕坐标
|
|
|
+ ::GetClientRect(hWnd, &rectClient); //获得客户区坐标
|
|
|
+ //非客户区宽,高
|
|
|
+ int nWidth = rectProgram.right - rectProgram.left -
|
|
|
+ (rectClient.right - rectClient.left);
|
|
|
+ int nHeiht = rectProgram.bottom - rectProgram.top -
|
|
|
+ (rectClient.bottom - rectClient.top);
|
|
|
+ nWidth += width;
|
|
|
+ nHeiht += hight;
|
|
|
+ rectProgram.right = nWidth;
|
|
|
+ rectProgram.bottom = nHeiht;
|
|
|
+ int showToScreenx =
|
|
|
+ GetSystemMetrics(SM_CXSCREEN) / 2 - nWidth / 2; //居中处理
|
|
|
+ int showToScreeny = GetSystemMetrics(SM_CYSCREEN) / 2 - nHeiht / 2;
|
|
|
+ bret = ::MoveWindow(hWnd, showToScreenx, showToScreeny, rectProgram.right,
|
|
|
+ rectProgram.bottom, false);
|
|
|
+ }
|
|
|
+ else // SetWindowSize
|
|
|
+ {
|
|
|
+ RECT rectClient;
|
|
|
+ HWND hWnd = (HWND)hwnd;
|
|
|
+ ::GetWindowRect(hWnd, &rectClient); //获得程序窗口位于屏幕坐标
|
|
|
+ bret = ::MoveWindow(hWnd, rectClient.left, rectClient.top, width, hight,
|
|
|
+ false);
|
|
|
+ }
|
|
|
+ return bret;
|
|
|
}
|
|
|
|
|
|
-bool WinApi::SetClipboard(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 WinApi::SetWindowState(LONG hwnd, LONG flag, LONG rethwnd)
|
|
|
+{
|
|
|
+ bool bret = false;
|
|
|
+ HWND hWnd = (HWND)hwnd;
|
|
|
+ if (IsWindow(hWnd) == false) return bret;
|
|
|
+ int type = -1;
|
|
|
+ type = flag;
|
|
|
+ if (flag == 0) //关闭指定窗口
|
|
|
+ ::SendMessage(hWnd, WM_CLOSE, 0, 0);
|
|
|
+ else if (flag == 1) //激活指定窗口
|
|
|
+ {
|
|
|
+ ::ShowWindow(hWnd, SW_SHOW);
|
|
|
+ ::SetForegroundWindow(hWnd);
|
|
|
+ }
|
|
|
+ else if (flag == 2) //最小化指定窗口,但不激活
|
|
|
+ ::ShowWindow(hWnd, SW_SHOWMINNOACTIVE);
|
|
|
+ else if (flag == 3) //最小化指定窗口,并释放内存,但同时也会激活窗口
|
|
|
+ ::ShowWindow(hWnd, SW_SHOWMINIMIZED);
|
|
|
+ else if (flag == 4) //最大化指定窗口,同时激活窗口.
|
|
|
+ ::ShowWindow(hWnd, SW_SHOWMAXIMIZED);
|
|
|
+ else if (flag == 5) //恢复指定窗口 ,但不激活
|
|
|
+ ::ShowWindow(hWnd, SW_SHOWNOACTIVATE);
|
|
|
+ else if (flag == 6) //隐藏指定窗口
|
|
|
+ ::ShowWindow(hWnd, SW_HIDE);
|
|
|
+ else if (flag == 7) //显示指定窗口
|
|
|
+ {
|
|
|
+ ::ShowWindow(hWnd, SW_SHOW);
|
|
|
+ ::SetForegroundWindow(hWnd);
|
|
|
+ }
|
|
|
+ else if (flag == 8) //置顶指定窗口
|
|
|
+ ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0,
|
|
|
+ SWP_NOMOVE | SWP_NOSIZE); //窗口置顶
|
|
|
+ else if (flag == 9) // 9 : 取消置顶指定窗口
|
|
|
+ ::SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
|
|
+ else if (flag == 10) //禁止指定窗口
|
|
|
+ ::EnableWindow(hWnd, false);
|
|
|
+ else if (flag == 11) //取消禁止指定窗口
|
|
|
+ ::EnableWindow(hWnd, true);
|
|
|
+ else if (flag == 12) // 12 : 恢复并激活指定窗口
|
|
|
+ ::ShowWindow(hWnd, SW_RESTORE);
|
|
|
+ else if (flag == 13) // 13 : 强制结束窗口所在进程.
|
|
|
+ {
|
|
|
+ DWORD pid = 0;
|
|
|
+ ::GetWindowThreadProcessId(hWnd, &pid);
|
|
|
+ // TSRuntime::EnablePrivilege(L"SeDebugPrivilege", true);
|
|
|
+ HANDLE hprocess = NULL;
|
|
|
+
|
|
|
+ hprocess = ::OpenProcess(PROCESS_ALL_ACCESS, false, pid);
|
|
|
+
|
|
|
+ ::TerminateProcess(hprocess, 0);
|
|
|
+ }
|
|
|
+ else if (flag == 14) // 14 : 闪烁指定的窗口
|
|
|
+ {
|
|
|
+ FLASHWINFO fInfo;
|
|
|
+ fInfo.cbSize = sizeof(FLASHWINFO);
|
|
|
+ fInfo.dwFlags =
|
|
|
+ FLASHW_ALL |
|
|
|
+ FLASHW_TIMERNOFG; //这里是闪动窗标题和任务栏按钮,直到用户激活窗体
|
|
|
+ fInfo.dwTimeout = 0;
|
|
|
+ fInfo.hwnd = hWnd;
|
|
|
+ fInfo.uCount = 0xffffff;
|
|
|
+ FlashWindowEx(&fInfo);
|
|
|
+ }
|
|
|
+ else if (flag == 15) //使指定的窗口获取输入焦点
|
|
|
+ {
|
|
|
+ ::ShowWindow(hWnd, SW_SHOW);
|
|
|
+ ::SetFocus(hWnd);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (type >= 0 && type < 16) bret = true;
|
|
|
+
|
|
|
+ return bret;
|
|
|
}
|
|
|
|
|
|
-bool WinApi::GetClipboard(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;
|
|
|
+bool WinApi::SetWindowTransparent(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 = SetLayeredWindowAttributes((HWND)hwnd, crKey, trans, 2);
|
|
|
+
|
|
|
+ return bret;
|
|
|
+}
|
|
|
|
|
|
- return bret;
|
|
|
+bool WinApi::SetClipboard(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;
|
|
|
}
|
|
|
|
|
|
-long WinApi::SendString(HWND hwnd, const wstring &s) {
|
|
|
- if (::IsWindow(hwnd)) {
|
|
|
- auto p = s.data();
|
|
|
- for (int i = 0; i < s.length(); ++i) {
|
|
|
- ::PostMessageW(hwnd, WM_CHAR, p[i], 0);
|
|
|
- ::Sleep(5);
|
|
|
- }
|
|
|
- return 1;
|
|
|
- }
|
|
|
- return 0;
|
|
|
+bool WinApi::GetClipboard(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;
|
|
|
}
|
|
|
|
|
|
-long WinApi::SendStringIme(HWND hwnd, const wstring &s) {
|
|
|
- if (::IsWindow(hwnd)) {
|
|
|
- auto p = s.data();
|
|
|
- for (int i = 0; i < s.length(); ++i) {
|
|
|
- ::PostMessage(hwnd, WM_IME_CHAR, p[i], 0);
|
|
|
- ::Sleep(5);
|
|
|
- }
|
|
|
- return 1;
|
|
|
- }
|
|
|
- return 0;
|
|
|
+long WinApi::SendString(HWND hwnd, const wstring& s)
|
|
|
+{
|
|
|
+ if (::IsWindow(hwnd)) {
|
|
|
+ auto p = s.data();
|
|
|
+ for (int i = 0; i < s.length(); ++i) {
|
|
|
+ ::PostMessageW(hwnd, WM_CHAR, p[i], 0);
|
|
|
+ ::Sleep(5);
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-long WinApi::RunApp(const wstring &cmd, long mode) {
|
|
|
- std::unique_ptr<wchar_t> cmdptr(new wchar_t[cmd.length()]);
|
|
|
- memcpy(cmdptr.get(), cmd.data(), cmd.length() * sizeof(wchar_t));
|
|
|
- /*SECURITY_ATTRIBUTES SA;
|
|
|
- SA.bInheritHandle = NULL;
|
|
|
- SA.*/
|
|
|
- STARTUPINFO si;
|
|
|
- PROCESS_INFORMATION pi;
|
|
|
- ZeroMemory(&si, sizeof(si));
|
|
|
- ZeroMemory(&pi, sizeof(pi));
|
|
|
- int bret;
|
|
|
- wstring curr_dir;
|
|
|
- if (mode == 1) {
|
|
|
- // find
|
|
|
- size_t pos;
|
|
|
- pos = cmd.find(L".exe");
|
|
|
- if (pos != wstring::npos && pos != 0) {
|
|
|
- for (int i = pos - 1; i >= 1; --i) {
|
|
|
- if (cmd[i] == L'\\' || cmd[i] == L'/') {
|
|
|
- pos = i;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if (pos > 0) {
|
|
|
- curr_dir = cmd.substr(0, pos);
|
|
|
- }
|
|
|
- }
|
|
|
- // setlog(curr_dir.c_str());
|
|
|
- }
|
|
|
- bret = ::CreateProcessW(
|
|
|
- nullptr, //// 应用程序名称
|
|
|
- cmdptr.get(), // 命令行字符串
|
|
|
- NULL, // 进程的安全属性
|
|
|
- NULL, // 线程的安全属性
|
|
|
- false, // 是否继承父进程的属性
|
|
|
- 0, // 创建标志
|
|
|
- nullptr, // 指向新的环境块的指针
|
|
|
- mode == 1 && !curr_dir.empty() ? curr_dir.c_str()
|
|
|
- : nullptr, // 指向当前目录名的指针
|
|
|
- &si, // 传递给新进程的信息
|
|
|
- &pi // 新进程返回的信息
|
|
|
- );
|
|
|
- if (bret) {
|
|
|
- CloseHandle(pi.hProcess);
|
|
|
- CloseHandle(pi.hThread);
|
|
|
- }
|
|
|
-
|
|
|
- return bret;
|
|
|
+long WinApi::SendStringIme(HWND hwnd, const wstring& s)
|
|
|
+{
|
|
|
+ if (::IsWindow(hwnd)) {
|
|
|
+ auto p = s.data();
|
|
|
+ for (int i = 0; i < s.length(); ++i) {
|
|
|
+ ::PostMessage(hwnd, WM_IME_CHAR, p[i], 0);
|
|
|
+ ::Sleep(5);
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-HWND WinApi::GetTopWindowSp(HWND hwnd) {
|
|
|
- HWND i = hwnd, temp;
|
|
|
+long WinApi::RunApp(const wstring& cmd, long mode)
|
|
|
+{
|
|
|
+ std::unique_ptr<wchar_t> cmdptr(new wchar_t[cmd.length()]);
|
|
|
+ memcpy(cmdptr.get(), cmd.data(), cmd.length() * sizeof(wchar_t));
|
|
|
+ /*SECURITY_ATTRIBUTES SA;
|
|
|
+ SA.bInheritHandle = NULL;
|
|
|
+ SA.*/
|
|
|
+ STARTUPINFO si;
|
|
|
+ PROCESS_INFORMATION pi;
|
|
|
+ ZeroMemory(&si, sizeof(si));
|
|
|
+ ZeroMemory(&pi, sizeof(pi));
|
|
|
+ int bret;
|
|
|
+ wstring curr_dir;
|
|
|
+ if (mode == 1) {
|
|
|
+ // find
|
|
|
+ size_t pos;
|
|
|
+ pos = cmd.find(L".exe");
|
|
|
+ if (pos != wstring::npos && pos != 0) {
|
|
|
+ for (int i = pos - 1; i >= 1; --i) {
|
|
|
+ if (cmd[i] == L'\\' || cmd[i] == L'/') {
|
|
|
+ pos = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (pos > 0) {
|
|
|
+ curr_dir = cmd.substr(0, pos);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // setlog(curr_dir.c_str());
|
|
|
+ }
|
|
|
+ bret = ::CreateProcessW(
|
|
|
+ nullptr, //// 应用程序名称
|
|
|
+ cmdptr.get(), // 命令行字符串
|
|
|
+ NULL, // 进程的安全属性
|
|
|
+ NULL, // 线程的安全属性
|
|
|
+ false, // 是否继承父进程的属性
|
|
|
+ 0, // 创建标志
|
|
|
+ nullptr, // 指向新的环境块的指针
|
|
|
+ mode == 1 && !curr_dir.empty() ? curr_dir.c_str()
|
|
|
+ : nullptr, // 指向当前目录名的指针
|
|
|
+ &si, // 传递给新进程的信息
|
|
|
+ &pi // 新进程返回的信息
|
|
|
+ );
|
|
|
+ if (bret) {
|
|
|
+ CloseHandle(pi.hProcess);
|
|
|
+ CloseHandle(pi.hThread);
|
|
|
+ }
|
|
|
+
|
|
|
+ return bret;
|
|
|
+}
|
|
|
|
|
|
- while (GetWindowLongA(i, GWL_STYLE) >= 0) {
|
|
|
- temp = GetParent(i);
|
|
|
- if (!temp) break;
|
|
|
- }
|
|
|
- return i;
|
|
|
+HWND WinApi::GetTopWindowSp(HWND hwnd)
|
|
|
+{
|
|
|
+ HWND i = hwnd, temp;
|
|
|
+ while (GetWindowLongA(i, GWL_STYLE) >= 0)
|
|
|
+ {
|
|
|
+ temp = GetParent(i);
|
|
|
+ if (!temp) break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return i;
|
|
|
}
|