偶在人物的click事件里添加代码SetForegroundWindow(hMain),
这样能够使main窗口激活,当拖动人物后,虽然我在dragcomplete事件里也添加了代码SetForegroundWindow(hMain),但是main窗口却不能激活,只是在任务栏闪动,
后来偶换成了postmessage,然后在主窗口获取消息再调用SetForegroundWindow(hMain),
但是结果一样。在word中,拖动助手放开后,word就被激活了,偶想做的就是那种效果,
望知道的大虾指点 ^_^

解决方案 »

  1.   

    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;
      

  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 }
      

  3.   

    楼上的代码,效果和SetForegroundWindow是一样的,只是闪烁。偶试过SetForegroundWindow的,没有拖动Agent人物的时候可以的,
    但是在拖动人物后该函数就没能做到那种效果了。或者说我想要的功能是拖动人物结束后,
    激活自己的主窗体
      

  4.   

    偶自己解决了,
    使用了键盘模拟api,
    keybd_event(VK_TAB,MapVirtualKey(VK_TAB, 0), 0, 0);
    keybd_event(VK_TAB, MapVirtualKey(VK_TAB, 0), KEYEVENTF_KEYUP, 0);
    这样的确得到了我需要的结果。
    但是这个函数是模拟键盘的,但是我不调用函数,直接按Tab键,却不能得到结果,
    感觉真是有点古怪!
    有兴趣的大家讨论讨论 :)