*
Soo ... jetzt aber ... nen bissel gefrickelt aber egal:
int close_wait();
void format_error(const unsigned long);
BOOL CALLBACK enum_child_proc(HWND, LPARAM);
#undef max
struct data
{
HWND hWnd;
int search_id;
data(int id) : search_id(id), hWnd(NULL) {}
};
template<typename T>
std::size_t digits(T const& num)
{
if (num == 0) return 1;
T tmp(num); std::size_t i = 1;
for (; tmp > 0; ++i) tmp /= 10;
return i;
}
int main()
{
std::cout << "<< ====== Hauptfenster ====== >>" << std::endl;
bool exist = false;
::HWND hWndParent = NULL;
do
{
std::cout << "Beschriftung: " << std::flush;
std::string window_name;
std::getline(std::cin, window_name);
hWndParent = ::FindWindowA(NULL, window_name.c_str());
if (hWndParent == NULL || ::IsWindow(hWndParent) == FALSE)
std::cerr << "Das Fenster \"" << window_name << "\" existiert nicht!" << std::endl;
else
exist = true;
} while (exist != true);
std::cout << ">> ====== Hauptfenster ====== <<" << std::endl;
std::cout << "<< ======== List-Box ======== >>\n"
<< "< ID: " << std::flush;
int window_id = 0;
while (!(std::cin >> window_id)) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }
data search(window_id);
EnumChildWindows(hWndParent, enum_child_proc, reinterpret_cast<LPARAM>(&search));
::HWND hWndList = search.hWnd;
if (hWndList == NULL)
{
std::cerr << "Das Element mit der ID existiert nicht!" << std::endl;
format_error(::GetLastError());
return close_wait();
}
LRESULT nListItemCount = ::SendMessageA(hWndList, LB_GETCOUNT, 0, 0);
if (nListItemCount == LB_ERR)
{
std::cerr << "Das Element mit der ID ist keine List-Box!" << std::endl;
format_error(::GetLastError());
return close_wait();
}
std::cout << ">> ======== List-Box ======== <<\n" << std::endl;
std::cout << "<< ==== Element - Inhalt ==== >>" << std::endl;
std::size_t item_count = static_cast<std::size_t>(nListItemCount);
std::size_t digit_count = digits(item_count);
for (std::size_t item = 0; item < item_count; ++item)
{
std::size_t len = static_cast<unsigned int>(::SendMessageA(hWndList, LB_GETTEXTLEN, item, 0));
char* arr = new char[len + 1];
::SendMessageA(hWndList, LB_GETTEXT, item, reinterpret_cast<LPARAM>(arr));
arr[len] = 0;
std::cout << std::setw(digit_count) << (item + 1) << ": " << arr << std::endl;
delete [] arr;
}
std::cout << ">> ==== Element - Inhalt ==== <<" << std::endl;
return close_wait();
}
int close_wait()
{
std::cout << "Press any key to continue" << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin.get();
return 0;
}
void format_error(const unsigned long err)
{
LPVOID lpMsgBuf = NULL;
::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<char*>(&lpMsgBuf), 0, NULL);
std::cerr << "FEHLER: " << static_cast<char*>(lpMsgBuf) << std::endl;
::LocalFree(lpMsgBuf);
}
BOOL CALLBACK enum_child_proc(HWND hWndChild, LPARAM lParam)
{
data * search = reinterpret_cast<data*>(lParam);
if (GetWindowLongA(hWndChild, GWL_ID) == search->search_id)
search->hWnd = hWndChild;
return TRUE;
}
...