Собственно вопрос, как правильно получить Extended Window Styles из HWND окна ? На данный момент у меня стоит задача отловить все скролищиеся окна в системе, пока делаю так
| Код | std::string indent = "";
void wstring_to_string(const std::wstring& src, std::string& dest) { std::string tmp; tmp.resize(src.size()); std::transform(src.begin(),src.end(),tmp.begin(),wctob); tmp.swap(dest); }
std::string convert(LPWSTR str) { std::string res; wstring_to_string(std::wstring(str),res); return res; }
static BOOL CALLBACK EnumWindowsChildProc(HWND hwnd, LPARAM lParam) { TCHAR buff[100]; int resC = GetClassName(hwnd,buff, 100); if (resC == 0) { std::cout << "EnumWindowsChildProc " << resC << " " << GetLastError() << std::endl; return FALSE; }
std::string clName = convert(buff);
WINDOWINFO pwi; GetWindowInfo(hwnd, &pwi);
if (((pwi.dwStyle & WS_HSCROLL) || (pwi.dwStyle & WS_VSCROLL)) || ((pwi.dwExStyle & WS_EX_LEFTSCROLLBAR) || (pwi.dwExStyle & WS_EX_RIGHTSCROLLBAR))) { std::cout << "find fucking scroll" << std::endl; }
long resEx = GetWindowLong(hwnd, GWL_EXSTYLE); if (((resEx & WS_EX_LEFTSCROLLBAR) || (resEx & WS_EX_RIGHTSCROLLBAR))) { std::cout << "find fucking scroll" << std::endl; }
// std::cout << indent.c_str() << "class name " << clName.c_str() << std::endl;
indent += " "; EnumChildWindows(hwnd, (WNDENUMPROC)EnumWindowsChildProc, NULL); return TRUE; }
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { TCHAR buff[100]; int resC = GetClassName(hwnd,buff, 100); if (resC == 0) { std::cout << "EnumWindowsProc " << resC << " " << GetLastError() << std::endl; return FALSE; }
std::string clName = convert(buff);
LPWSTR pszMem; int length = GetWindowTextLength(hwnd);
pszMem = (LPWSTR) VirtualAlloc((LPVOID) NULL, (DWORD) (length + 1), MEM_COMMIT, PAGE_READWRITE);
GetWindowText(hwnd, pszMem, length + 1);
std::string title = convert(pszMem);
if (IsWindowVisible(hwnd) && !title.empty()) { std::cout << "title " << title.c_str() << std::endl; indent = " "; EnumChildWindows(hwnd, (WNDENUMPROC)EnumWindowsChildProc, NULL); }
return TRUE; // continue enumeration }
int _tmain(int argc, _TCHAR* argv[]) { std::cout << "-------------------------------------" << std::endl; HWND hd = GetDesktopWindow();
EnumWindows((WNDENUMPROC)EnumWindowsProc, NULL);
while(1){ Sleep(1000); }
return 0; }
|
пробегаю по всем окнам, затем смотрю их детей и ищю те компоненты которые будут скролиться, на сам скролл проверяю так
| Код |
WINDOWINFO pwi; GetWindowInfo(hwnd, &pwi);
if (((pwi.dwStyle & WS_HSCROLL) || (pwi.dwStyle & WS_VSCROLL)) || ((pwi.dwExStyle & WS_EX_LEFTSCROLLBAR) || (pwi.dwExStyle & WS_EX_RIGHTSCROLLBAR)))
|
и так
| Код | long resEx = GetWindowLong(hwnd, GWL_EXSTYLE); if (((resEx & WS_EX_LEFTSCROLLBAR) || (resEx & WS_EX_RIGHTSCROLLBAR)))
|
но, есть жирное но, почему то WS_EX_RIGHTSCROLLBAR или WS_EX_LEFTSCROLLBAR никогда не отлавливается. В том же spy++ в свойствах элемента вижу WS_EX_RIGHTSCROLLBAR, у меня это не ловится. Естественно я задаюсь вопросом может я как то не так проверяю или не верно получаю эти свойства ? |