有个问题想和你讨论一下,就是下面这段代码:
procedure TForm1.Button1Click(Sender: TObject);
var
f1:longint;
begin
f1:=GetForegroundWindow;
//f1:=getdesktopwindow;
caption:=IntToStr(f1);end;
在这个Button1.CLICK过程中,F1得到的值永远都是这个BUTTON1所在窗口的HANDLE,我想点一下桌面上的任意一个窗口后,再来点击这个BUTTON1,就能得到HANDLE,能实现吗?该怎么办呢?

解决方案 »

  1.   

    问题很简单,因为你把这段代码写在了BUTTON1的click事件中了.你要让这段代码执行是不是得单击这个按钮??
    那就得了,得到的当前窗口句柄就是BUTTON1的句柄了!
    你可以这样:
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
    f1:longint;
    begin
    f1:=GetForegroundWindow;
    //f1:=getdesktopwindow;
    caption:=IntToStr(f1);
    end;
      

  2.   

    要做一个判断,看看GetForegroundWindow是不是tform1自己,如果是的话,排除掉。不然,你每次点击button1时,GetForegroundWindow就变成了tform1自己了,而不是你要点击的那个窗口。也就是出现了你上面的情况。
    解决的办法很容易的,你自己应该能办到的。
      

  3.   

    我想过用计时器,可我没有做,我觉得这样不是太佳解决方案,因为我做的是屏幕键盘呀,Timer的中断时间只能定成300MS为合适,但这样的话,会不会太费CPU了,可以试想它的执行过程:当键盘被打开后,它开始不停的检测当前的Activewindow,如果是自己或没改变就不更换HANDLE的值,当我点击某个窗口后,再点击这个键盘中的键,然后把键值送给点击的窗口,然后再把Handle的窗口SetActiveWindow,这样键盘窗口会不会太费CPU了呢?
      

  4.   

    "有个问题想和你讨论一下,就是下面这段代码:
    procedure TForm1.Button1Click(Sender: TObject);
    var
    f1:longint;
    begin
    f1:=GetForegroundWindow;
    //f1:=getdesktopwindow;
    caption:=IntToStr(f1);end;
    在这个Button1.CLICK过程中,F1得到的值永远都是这个BUTTON1所在窗口的HANDLE,我想点一下桌面上的任意一个窗口后,再来点击这个BUTTON1,就能得到HANDLE,能实现吗?该怎么办呢?"""
    你在电击的时候,你的窗口当然处在最前边了,所以得到是自己的handle了,你可以写到timer事件里去,或者hook
      

  5.   

    我想过用计时器,可我没有做,我觉得这样不是太佳解决方案,因为我做的是屏幕键盘呀,Timer的中断时间只能定成300MS为合适,但这样的话,会不会太费CPU了,可以试想它的执行过程:当键盘被打开后,它开始不停的检测当前的Activewindow,如果是自己或没改变就不更换HANDLE的值,当我点击某个窗口后,再点击这个键盘中的键,然后把键值送给点击的窗口,然后再把Handle的窗口SetActiveWindow,这样键盘窗口会不会太费CPU了呢?反应好慢呀