我有過程(和名稱)的PID,我想把它帶到Linux(Ubuntu)的前端。在Mac上,我只是做SetFrontProcess(pid)
,在窗口上我列舉了窗口,挑出了我想要的,然後打電話給SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
,但是我在linux上做了些什麼。我已經看了一下X Lib,但是大多數/所有這些函數似乎在你的進程中的窗口上運行。如何將進程窗口帶到X Windows的前臺? (C++)
編輯:使用BDK的回答我說這些助手到我的代碼來獲取窗口
bool searchHelper(Display* display, Window w, Atom& atomPID, unsigned long pid, Window& result)
{
bool ret = false;
Atom atomType;
int format;
unsigned long nItems;
unsigned long bytesAfter;
unsigned char* propPID = 0;
if (Success == XGetWindowProperty(display,w,atomPID,0,1,False,XA_CARDINAL,&atomType,&format,&nItems,&bytesAfter,&propPID))
{
if (propPID != 0)
{
if (pid == *((unsigned long *)propPID))
{
result = w;
ret = true;
}
XFree(propPID);
}
}
if (ret)
return ret; //we found we can stop
//check the children of the window
Window wRoot;
Window wParent;
Window *wChild=NULL;
unsigned nChildren=0;
if (XQueryTree(display, w, &wRoot, &wParent, &wChild, &nChildren) != 0)
{
for (unsigned i=0; i<nChildren; ++i)
{
ret = searchHelper(display, wChild[i], atomPID, pid, result);
if (ret)
break;
}
}
return ret;
}
bool getWindowFromPid(unsigned long pid, Display* display, Window& result)
{
Window window = XDefaultRootWindow(display);
Atom atomPID = XInternAtom(display, "_NET_WM_PID", true);
if (atomPID == None)
{
qDebug("XInternAtom failure");
return false;
}
return searchHelper(display, window, atomPID, pid, result);
}
現在,我順利拿到窗口,但是當我做了以下
if (getWindowFromPid(pid,display,window))
{
qDebug("Found window ID:%d", window);
int result = XRaiseWindow(display,window);
qDebug("XRaiseWindow returned:%d", result);
}
XRaiseWindow返回1(BadRequest)。 XRaiseWindow的文檔沒有提到BadRequest的返回代碼是一個可能的結果。我不確定什麼是錯的。我不允許在另一個過程中將它稱爲窗口嗎?這種重點防止鋼材會妨礙我嗎?有什麼想法嗎?
編輯編輯:
所以看着就當你與-frame所謂xwininfo.c它,我改變了我的代碼如下所示基於BDK的建議。
if (getWindowFromPid(pid,display,window))
{
qDebug("Found window ID:%d", window);
//Need the windowmanger frame (or parent) id not window id
Window root, parent;
Window *childlist;
unsigned int ujunk;
int status = XQueryTree(display, window, &root, &parent, &childlist, &ujunk);
if (status && parent && parent != root)
{
qDebug("Found frame window ID:%d",parent);
window = parent;
}
XSetWindowAttributes xswa;
xswa.override_redirect=True;
int result = XChangeWindowAttributes (display,window,CWOverrideRedirect,&xswa);
qDebug("XChangeWindowAttributes returned:%d", result);
result = XRaiseWindow(display,window);
qDebug("XRaiseWindow returned:%d", result);
}
else
qDebug("unable to find the window for the pid");
在這一點上我確實覺得窗框ID,但我得到來自XChangeWindowAttributes和XRaiseWindow的「1」的返回代碼。我只是不允許修改另一個流程的窗口嗎?
您將通過詢問「如何將進程窗口帶到X Windows上的前景?」獲得更好的結果。 – 2010-05-18 14:42:57
@Vulcan謝謝,我編輯了問題標題。 (注意最初的問題:「我如何在Linux(C++)中將流程引入前臺?」) – Lorenz03Tx 2010-05-18 14:46:27
如果你想獲得技術,標題仍然是錯誤的 - 沒有「X Windows」這樣的東西。這是「X窗口系統」(但「窗口」不應該複數化)。 – 2010-05-18 15:00:11