Zugriff auf Steuerelemente
-
Liebe Community,
ich recherhiere seit Tagen, wie ich unter Ubuntu mit Hilfe von C auf Steuerelemente einer "fremden" Anwendung zugreife... Unter Windows war dies ja kein Problem, man holte sich einfach die Handle (HWND).... Wie realisiere ich das Unter Linux?
Genauer gesagt: ich benutze Ubuntu und Gnome.Ich wäre sehr dankbar über Konstruktive Anregungen.
-
Ich weiß nicht, ob man auf die Steuerelemente eines anderen Fensters zugreifen kann (und wenn ja ist das vom Toolkit abhängig), aber man kann mit Hilfe der Xlib oder xcb auf andere Fenster zugreifen. Um zunächst einmal eine Liste der Fenster zu erhalten, kannst du folgendes versuchen:
#include <cstdlib> #include <iomanip> #include <iostream> #include <limits> #include <xcb/xcb.h> #include <xcb/xcb_atom.h> int main() { int screen_num = 0; xcb_connection_t *con = xcb_connect(NULL, &screen_num); if(!con) { std::cerr << "Cannot connect to the X server." << std::endl; exit(1); } xcb_screen_t *screen; for(xcb_screen_iterator_t it = xcb_setup_roots_iterator(xcb_get_setup(con)); it.rem; screen_num--, xcb_screen_next(&it)) if(!screen_num) screen = it.data; xcb_atom_t NET_CLIENT_LIST = xcb_atom_get(con, "_NET_CLIENT_LIST"); xcb_get_property_cookie_t cookie = xcb_get_property(con, 0, screen->root, NET_CLIENT_LIST, WINDOW, 0, std::numeric_limits<uint32_t>::max()); xcb_generic_error_t *error; xcb_get_property_reply_t *reply = xcb_get_property_reply(con, cookie, &error); if(error) { std::cerr << "Could not get client list." << std::endl; exit(1); } xcb_window_t *clients = static_cast<xcb_window_t*>(xcb_get_property_value(reply)); for(int c = 0; c < reply->length; c++) std::cout << "0x" << std::setfill('0') << std::setw(8) << std::hex << clients[c] << (c == reply->length - 1 ? "." : ", "); std::cout << std::endl; free(reply); xcb_disconnect(con); return 0; }