2013-05-15 2 views
2

Я использовал эту функцию, чтобы открыть новую вкладку в Chrome и неактивна, это:Открыть URL с ShellExecute - SW_SHOWMAXIMIZED DonT активное окно в C++

ShellExecuteA(0,0,"chrome.exe","http://google.com --incognito",0,SW_SHOWMAXIMIZED); 

но Chrome только открыть новую вкладку, но оно не активное окно.
(Я вызываю эту функцию из глобальной клавиатуры-крючка приложения без пользовательского интерфейса, если пользователь нажимает указанный ключ).

Как я могу это исправить?

+0

http://stackoverflow.com/questions/557166/bring-to-front-for-windows-xp -command-shell Помогает ли это? –

+0

Как правило, вы не можете привозить произвольные окна на передний план, поэтому нет простого способа сделать это. См. Раздел «Примечания» здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539(v=vs.85).aspx – n0rd

ответ

1

Похоже на ошибку в chrome.exe. Я мог бы перепрограммировать ваш вызов ShellExecute из простого консольного приложения, если был запущен обычный (не-инкогнито) chrome.exe сеанс и не выполнялся сеанс инкогнито. Другими словами, если необходимо создать новую сессию хромированного инкогнито, обычный сеанс не отображал правильное распространение флагов ShowWindow на порожденный процесс инкогнито. Другим фактором было то, что отказ активации также требовал, чтобы регулярный сеанс chrome был активным до запуска тестового приложения. Если какое-либо другое приложение было активным (скажем notepad.exe), то активация сеанса инкогнито преуспела. То же самое происходит с ShellExecuteEx и CreateProcess. Наблюдая в Process Explorer (из sysinternals), ясно, что chrome.exe при необходимости обрабатывает дочерний процесс, а затем завершается. Это затрудняет перехват hProcess или processId, чтобы в конечном итоге вызвать SetActiveWindow.

+0

'SetActiveWindow' может работать только с окнами из вашего собственного процесса , Вы не можете использовать его с другими окнами процесса. – n0rd

+0

@ n0rd Хорошее разъяснение - его можно было бы вызвать через DLL-инъекцию. Или можно использовать SetForegroundWindow. Моя точка зрения была связана с трудностями даже с получением HWND (через hProcess или processId) в первую очередь. –

0

Невозможно. Вы должны сделать Google Chrome браузером по умолчанию, и чем попробовать это:

(протестирован только на WinXP с использованием IE6)

первую функцию, которая находит приложение по умолчанию для любого расширения файла: **

введите код здесь

#include<Registry.hpp> 

AnsiString GetDefaultApp(AnsiString ext) 
    { 
    TRegistry* reg = new(TRegistry); 
    reg->RootKey = HKEY_CURRENT_USER; 
    if(!reg->OpenKeyReadOnly("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\."+ext+"\\OpenWithList")) 
     return(NULL); 
    try 
     { 
     AnsiString MRUList = reg->ReadString("MRUList"); 
     AnsiString ret = reg->ReadString(AnsiString(char(MRUList[1]))); 
     return(ret); 
     } 
    catch(...) 
     { 
     return(NULL); 
     } 
    } 

теперь код для запуска приложения по умолчанию для HTML-файлов и предоставления в URL в качестве параметра: **

#include<shellapi> 
void OpenURL(AnsiString URL) 
    { 
    AnsiString app = GetDefaultApp("html"); 
    if(app == NULL) 
     return; 
    ShellExecute(NULL,"open",app.c_str(),URL.c_str(),NULL,SW_SHOWDEFAULT); 
    } 

Теперь вы можете открыть URL в новом окне браузера, используя эту команду:

OpenURL("http://www.AlgorithMan.de/"); 
Смежные вопросы