在Kylix中模拟Windows API中的FindWindow函数[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 ewolf 的 blog

 

在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}

本文关键:Kylix,FindWindow,XFetchName,XQueryTree,Delphi
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top