首页  编辑  

将一个被其它程序遮住的窗口激活并弹出到所有窗口的最前面

Tags: /超级猛料/VCL/Form,窗体/FAQ/   Date Created:

嘿嘿,正好我今天看到,贴给你。

unit SysFocus;

interface

uses

 Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs;

type

 TSysFocus=class(TComponent)

   public

     function GetSysFocus:integer;

     function SetSysFocus(hwnd:integer):integer;

 end;

implementation

function TSysFoucs.GetSysFocus;//取当前活动窗口

var

 hOtherWin,OtherThreadID,hFocusWin:integer;

begin

 hOtherWin:=GetForegroundWindow;

 OtherThreadID:=GetWindowThreadProcessID(hOtherWin,nil);

 if AttachThreadInput(GetcurrentThreadID,OtherThreadID,True) then

 begin

   hFocusWin:=GetFocus;

   result:=GetFocus;

   if HFocusWin<>0 then

     try

       //SendMessage(GetFocus,WM_COPY,0,0);//书上是这么写的

     finally

       AttachThreadInput(GetcurrentThreadID,OtherThreadID,False);

     end;

 end

 else result:=GetFocus;

end;

function TSysFocus.SetSysFocus(hwnd:integer):integer;//设置某窗口为活动窗口

var

 hOtherWin,OtherTHreadID,hFocusWin:integer;

begin

 hOtherWin:=GetForegroundWindow;

 OtherThreadID:=GetWindowThreadProcessID(hOtherWin,nil);

 if AttachThreadInput(GetcurrentThreadID,OtherThreadID,True) then

 begin

   hFocusWin:=GetFocus;

   SetFocus(hwnd);

   //SendMessage(hwnd,WM_COPY,0,0);

   if hFocusWin<>0 then

     try

       //SendMessage(GetFocus,WM_COPY,0,0);

     finally

       AttachThreadInput(GetCurrentTHreadID,OtherTHreadID,False);

     end;

 end

 else result:=SetFocus(hwnd);

end;

end.