在kylix中模拟windows api中的findwindow函数
(译者注:因为我还没有用过kylix,第一次翻译kylix方面的文章可能会有不少的错误,如果我的翻译对您的阅读增加了困难的话,请参照原文,在此表示深深的歉意。翻译时略有删节)
概要:这篇文章描述了一个非常便利的findwindow函数。作者:matthias thoma。
在xwindow界面函数库xlib中没有类似于windows api的findwindow函数。然而,用一个已知的id得到一个窗口的名字是可能的,而且非常容易。这将用到xfetchname函数,xfetchname原型为:
function xfetchname(display: pdisplay; w: twindow;
windownamereturn: ppchar): tstatus; cdecl;
比较难的步骤是如何得到每一个窗口的id。为此,你就需要xlib中的xquerytree函数,这个函数检索指定的窗口,得到子窗口,根,父窗口和子窗口个数的一个列表。联合这两个函数和一个标准的查找算法,你就得到了一个与windows的findwindow具有相同功能的函数了。
函数xquerytree的原型为:
function xquerytree(display: pdisplay; w: twindow; rootreturn: pwindow;
parentreturn: pwindow; _para5: ppwindow; nchildrenreturn: pcardinal): tstatus;
the following code shows how to do it. it is a kylix translation of a public domain source by brian paul.
下面的代码演示了怎样完成这一功能。
{ findwindow 函数
input: dpy - the x display
scr - the x screen 的数目
start - 在哪儿开始搜索, 通常根窗口
name - 要查找的窗口的弥
}
function findwindow(display: pdisplay; screen: integer; start: twindow; name: pchar): twindow;
type
achildren = array[0..0] of window;
pchildren = ^achildren;
var
stat: tstatus;
n: integer;
num: cardinal;
w: window;
root: window;
parent: window;
children: pchildren;
title: pchar;
begin
if (xfetchname(display, start, @title) = 1) then
begin
if (strcmp(name, title )=0) then
begin
xfree(title);
result := start;
exit;
end;
xfree(title);
end;
stat := xquerytree(display, start, @root, @parent, @children, @num);
if (stat = 1) then
begin
{ search each child window for a match: }
for n := num-1 downto 0 do
begin
if (xfetchname(display, start, @title )=1) then
begin
if (strcmp(name, title)=0) then
begin
{ found it }
xfree(title);
result := start;
exit;
end;
xfree(title);
end;
end;
{ search the descendents of each child for a match: }
for n := num-1 downto 0 do
begin
w := findwindow(display, screen, children^[n], name);
if (w <> 0) then
begin
xfree(children);
result := w;
exit;
end;
end;
if (children <> nil) then
begin
xfree(children);
end;
end;
result := 0;
end;
如果kylix正在运行,你使用这个函数就能找出:
function iskylixrunning: boolean;
begin
result := findwindow(qtdisplay,xdefaultscreen(qtdisplay),xdefaultrootwindow(qtdisplay),'kylix') <> 0;
end;
或许你想要一些ifdef,现在delphi是跨平台的了:
function isdelphirunning: boolean;
begin
result := false;
{$ifdef linux}