在写个监控统计的程序,需要在获知用户使用某一功能后,立即获取当前窗口的标题,取出标题中含有的正在操作的文件名称(每次操作的都不相同,但后面的内容是固定的)。程序使用了GetForegroundWindow和GetWindowText函数。var
  hCurrentWindow: THandle;
  WindowTitle: array[0..254] of Char;
  sName :string;
  iPos :integer;
begin
  hCurrentWindow := GetForegroundWindow; //找出当前操作系统中活动的第一个窗口  if GetWindowText(hCurrentWindow, @WindowTitle, 255) > 0 then
    //如果找到窗口的标题
  begin
    if Pos('tmp - 北京',WindowTitle) > 0 then
    //如果找到的正是目标窗口
     begin
      iPos := Pos('tmp',WindowTitle);
      if iPos > 0 then
        sName := Copy(WindowTitle, 1, iPos + 2);
    end;
    memo1.Lines.Add('文件名:' + sName);
  end;
end;
此段代码在windows2000,xp都可以顺利获取,而在98、me下是获取不到内容的。我查过GetForegroundWindow和GetWindowText函数在98下面也是有的,但不知为什么会取不出标题。因没装98,也就没在98下作开发测试,只能在客户机上测试,比较麻烦。如果不行只能用虚拟机上装个98来测了。

解决方案 »

  1.   

    没人懂吗?晕。估计是不是win98有Bug或是win98下使用的方法不同?
      

  2.   

    一早就不弄WIN9X的东西,淘汰系统,根本不考虑支持
      

  3.   

    你这段代码写得有些冗余,写法也不好。你表述一下你要实现的功能,比如说你要获取窗口标题的哪部分等。依你的问题我猜测,你直接把你代码中的 if Pos('tmp - 北京',WindowTitle) > 0 then 这行删除掉,应该就可以了。因为这一句写得非常冗余,win98下使用可能就是这句不成立所导致。其实这句没有必要写,它必须成立下面的才有意义,而下面的你又重新判断了,所以没有必要写上这句。看来你是一个新手,虽然给分不多,但你的问题也够简单的。
      

  4.   

    呵呵,程序并不是写得冗余,都是必须的。
    if Pos('tmp - 北京',WindowTitle) > 0 then 这一句是检查当前窗口是否是想要是窗口,'tmp - 北京'是该程序独有的特征,其格式可以是a.tmp - 北京XXXXXX,b.tmp - 北京XXXXXXX。而接下来的Pos('tmp',WindowTitle)是定位到'tmp'上,然后把a.tmp都取出来,这才是想要的东西。不过现在问题解决了,并不是win98的取不了标题,只能怪自己太粗心,:(我在虚拟机上装了win98,运行该程序,发现在win98下,该程序的标题中文件名的扩展名都是大写 'TMP'。如a.TMP,b.TMP,而在2000、xp时,都是a.tmp,b.tmp。可能是win98的机制造成的吧。现在把标题都转成大写或小写再检查就可以了。谢谢楼上热心的两位。