比如打开了一个程序使用时,如果切换到其他程序时,他会自动切换到原先打开的程序中(无论第一个程序有多少个窗口,在任意窗口时,都能自动切换回来)。

解决方案 »

  1.   

    谢谢关注,我的意思就是 ‘还是同时让焦点也一直在这个窗口上’ ,比如我正在前一个程序录入数据,这个时候如果切换到其他程序中,或者使用CTRL+ESC键一类的时候,原先的程序就会失去焦点,这个时候就需要原先打开的程序自动检测,如果焦点不在的话,就会自动的焦点定位到第一个程序上。同时第一个程序也在整个系统中最前
      

  2.   

    使那些系统键失效,然后控制鼠标活动在你窗口的范围里就可以了。看看SetWindowsHookEx的帮助,或找找低级键盘钩子的资料。http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/lowlevelkeyboardproc.asp
      

  3.   

    下面是msdn上的一个例子,自己看看。
    http://support.microsoft.com/default.aspx?scid=kb;en-us;226359
      

  4.   

    谢谢各位,通过
    function ForceForegroundWindow(hwnd: THandle): boolean;
    var
      hCurWnd: THandle;
    begin
      hCurWnd := GetForegroundWindow;
      AttachThreadInput(GetWindowThreadProcessId(hCurWnd, nil), GetCurrentThreadId, True);
      Result := SetForegroundWindow(hWnd);
      AttachThreadInput(GetWindowThreadProcessId(hCurWnd, nil), GetCurrentThreadId, False);
    end;已经解决,准备散分。 
    对了,如何判断当前程序是否有焦点? 总不能在timer中不停的  ForceForegroundWindow吧
    无焦点就 ForceForegroundWindow
      

  5.   

    这样的话标题栏 是绝对不闪的啊。 使用SetForegroundWindow会闪
      

  6.   

    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
        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
          Result := false;
          ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
          ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
          if AttachThreadInput(ThisThreadID, ForegroundThreadID, true) then
          begin
            BringWindowToTop(hwnd);  
            SetForegroundWindow(hwnd);
            AttachThreadInput(ThisThreadID, ForegroundThreadID, false);
            Result := (GetForegroundWindow = hwnd);
          end;
          if not Result then
          begin
            SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
            SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0), SPIF_SENDCHANGE);
            BringWindowToTop(hwnd);  
            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;或者这样也可以了。效果差不多,所以我就用了那个简单的