一个程序A同时运行两个,记做A1,A2。那么A1和A2的很多信息应该是一样的。现在想把焦点从A2转给A1窗体上来,请教高手指点该如何做?谢谢!

解决方案 »

  1.   

    用 enumWindows 找出系统所有运行的程序,
    然后,找出 A1,A2 程序的Handle(根据窗口名)
    与自己 Application.MainForm.Handle 不同的,就是另外一个程序了,然后,用下面的代码切换过去
      

  2.   

    function ForceForegroundWindow(hwnd: THandle): Boolean;
    const
      SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
      SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
    var
      ForegroundThreadID: DWORD;
      ThisThreadID: DWORD;
      timeout: DWORD;
    begin
      if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);  if GetForegroundWindow = hwnd then Result := True
      else
      begin
        // Windows 98/2000 doesn't want to foreground a window when some other
        // window has keyboard focus    if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
          ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
          ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
          (Win32MinorVersion > 0)))) then
        begin
          // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
          // Converted to Delphi by Ray Lischner
          // Published in The Delphi Magazine 55, page 16      Result := False;
          ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
          ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
          if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
          begin
            BringWindowToTop(hwnd); // IE 5.5 related hack
            SetForegroundWindow(hwnd);
            AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
            Result := (GetForegroundWindow = hwnd);
          end;
          if not Result then
          begin
            // Code by Daniel P. Stasinski
            SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
            SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
              SPIF_SENDCHANGE);
            BringWindowToTop(hwnd); // IE 5.5 related hack
            SetForegroundWindow(hWnd);
            SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
          end;
        end
        else
        begin
          BringWindowToTop(hwnd); // IE 5.5 related hack
          SetForegroundWindow(hwnd);
        end;    Result := (GetForegroundWindow = hwnd);
      end;
    end; { ForceForegroundWindow }
    // 2. Way:
    //**********************************************procedure ForceForegroundWindow(hwnd: THandle);
      // (W) 2001 Daniel Rolf
      // http://www.finecode.de
      // [email protected]
    var
      hlp: TForm;
    begin
      hlp := TForm.Create(nil);
      try
        hlp.BorderStyle := bsNone;
        hlp.SetBounds(0, 0, 1, 1);
        hlp.FormStyle := fsStayOnTop;
        hlp.Show;
        mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
        SetForegroundWindow(hwnd);
      finally
        hlp.Free;
      end;
    end;// 3. Way:
    //**********************************************
    // by Thomas Stutz{
      As far as you know the SetForegroundWindow function on Windows 98/2000 can
      not force a window to the foreground while the user is working with another window.
      Instead, SetForegroundWindow will activate the window and call the FlashWindowEx
      function to notify the user. However in some kind of applications it is necessary
      to make another window active and put the thread that created this window into the
      foreground and of course, you can do it using one more undocumented function from
      the USER32.DLL.  void SwitchToThisWindow (HWND hWnd,  // Handle to the window that should be activated
      BOOL bRestore // Restore the window if it is minimized
    );}procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall;
      external user32 Name 'SwitchToThisWindow';
             {x = false: Size unchanged, x = true: normal size}
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      SwitchToThisWindow(FindWindow('notepad', nil), True);
    end;
      

  3.   

    多谢 aiirii! 我还想问一下:应该在窗体的哪个事件中调用这个函数呢,我试了OnAppActivate 、OnActiveFormChange、FormActivate、FormKeyPress都不行,FormClick里面执行倒是有效,但是这不是我要的最终结果。我想的是,假设还有一个其它程序B,现在用tab键切换时,如果切换到A2,则根本不显示A2的界面就直接跳显示A1的程序界面了;或者最好在按alt+tab键时,A1 A2同时运行且满足某个条件时 根本看不到可以选择A2这个程序只有A1可选择这个效果。不知道我说明白没有,这样的效果应该可以达到吧