2017-11-18 17 views
0

他のアプリケーションを実行するHTTPサーバーアプリケーション(デスクトップアプリケーションとして実行されるサービスアプリケーション)があり、後で別のアプリケーションのウィンドウをアクティブにする必要があります。コンピュータXにはすべてのアプリケーションが含まれています。コンピュータXのOperaウェブブラウザからhttp://192.168.16.21:225/command/TTaskType.ttTestTaskを実行すると、私のWinActivate機能が動作します。コンピュータYからhttp://192.168.16.21:225/command/TTaskType.ttTestTaskを実行すると、ウィンドウはアクティブ化されません。なしデバッグ出力はエラーを返します(私はFLastErrorYを出力します)。私はさらに、管理者としてHTTPサーバーを実行しようとしました。 他に何を試すことができます他のアプリケーションのウィンドウをアクティブにする方法

function WinActivate(const AWinTitle: string): boolean; 
var 
    _WindowHandle: HWND; 
    _KeyboardState: TKeyboardState; 
begin 
    ResetError; 
    _WindowHandle := FindWindow(nil, PWideChar(AWinTitle)); 
    FLastError := GetLastError; 
    SetCursorPos(10, 12); 
    OutputDebugString(PWideChar('FLastError1: ' + IntTostr(FLastError) + 
    ', _WindowHandle: ' + Format('%.8X', [_WindowHandle]) + ' ' + DateTimeToStr(Now))); 
    if _WindowHandle <> 0 then 
    begin 
    //ShowWindow(_WindowHandle, SW_MINIMIZE); 
    if IsIconic(_WindowHandle) then 
    begin 
     ShowWindow(_WindowHandle, SW_RESTORE); 
     ResetError; 
     Result := IsIconic(_WindowHandle); 
     if Result then 
     Result := WinWaitActive(AWinTitle, 1000); 
    end 
    else 
     Result := SetForegroundWindow(_WindowHandle); 

    OutputDebugString(PWideChar('FLastErrorX: ' + IntTostr(FLastError) + 
     ', _WindowHandle: ' + Format('%.8X', [_WindowHandle]) + ' ' + DateTimeToStr(Now))); 
    if not Result then 
    begin 
     FLastError := GetLastError; 
     OutputDebugString(PWideChar('FLastError2: ' + IntTostr(FLastError) + 
     ', _WindowHandle: ' + Format('%.8X', [_WindowHandle]))); 

     // Applications might lock focus, so, hack it around 
     GetKeyBoardState(_KeyboardState); 

     ShowWindow(_WindowHandle, SW_SHOWNORMAL); 
     SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_UPDATEINIFILE); 

     if _KeyboardState[VK_MENU] <> 1 then 
     keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY or 0, 0); 

     ResetError; 
     if not SetForegroundWindow(_WindowHandle) then 
     begin 
     FLastError := GetLastError; 
     if not SetForegroundWindow(_WindowHandle) then 
    begin 
    FLastError := GetLastError; 
    OutputDebugString(PWideChar('FLastErrorY: ' + IntTostr(FLastError) + 
     ', _WindowHandle: ' + Format('%.8X', [_WindowHandle]) + ' ' + DateTimeToStr(Now))); 
    end; 
     end; 

     keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); 

     OutputDebugString(PWideChar('FLastError3: ' + IntTostr(FLastError) + 
     ', _WindowHandle: ' + Format('%.8X', [_WindowHandle]) + ' ' + DateTimeToStr(Now))); 

     Result := FLastError = 0; 
    end; 

    if not Result then 
    begin 
     SetWindowPos(_WindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOMOVE); 
     SetWindowPos(_WindowHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOMOVE); 
    end; 
    end; 

    Result := WinWaitActive(AWinTitle, 1000); 
    OutputDebugString(PWideChar('Dabar')); 
end; 
+0

['SetForegroundWindow()'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms633539)を読んでください。 aspx)のドキュメント。窓を前景に持っていくためには、多くの条件が満たされなければならない。また、 'SetForegroundWindow()'と 'keybd_event()'はエラーを報告するために 'SetLastError()'を使用しないので、 'FLastError3'の' GetLastError() 'の値は無意味です。 –

+0

エラーチェックが間違っています。以前の呼び出しが失敗した場合にのみGetLastErrorを呼び出し、GetLastErrorが何か意味のあるものを返すことをドキュメントから通知します。デスクトップアプリケーションでコードを実行してみてください。おそらくこのコードはセッション0で実行されます。 –

+0

@DavidHeffernanどのアプリケーションですか? HTTPサーバーか、ウィンドウをアクティブにするはずですか?後でデスクトップアプリケーションです。 –

答えて

0

私は何が間違っているかを見つけました。私はAutoHotkeyがウィンドウの起動機能を持っていることを知っていました。私はそのソースコードをダウンロードしており、ウィンドウアクティベーションコードはよく書かれ、コメントされています。だから私はAutoHotkeyを使ってテストアプリケーションをビルドし、私のウィンドウはアクティブ化されませんでした。アクティブなユーザがログインしていないからだとわかりました。

関連する問題