Войти

Показать полную графическую версию : Программное открытие ссылки


avmir
20-09-2009, 19:33
На WinForm имеется DataGridView, в ячейках которого содержатся ссылки на HTML страницы в Инете. При CellFormatting отображается только текст ссылки, при клике (CellContentClick) запускается процесс Process.Start(URI ссылки).

Ворос: как открывать такую ссылку в новом окне (если Браузер закрыт) и в новой вкладке (если есть окно Браузера), при этом чтобы фокус оставался на моем приложении?

Delirium
21-09-2009, 01:19
как открывать такую ссылку в новом окне (если Браузер закрыт) и в новой вкладке (если есть окно Браузера), при этом чтобы фокус оставался на моем приложении? »
Смотря какой браузер. К примеру, у меня Opera. При открытой фоново опере ссылки открываются в новой вкладке, а фокус остается на моей программе. Если закрыт, то открывает в новом окне.
Скорее всего, вручную задать способ открытия не получится, т.к. функцией Process.Start вы передаете параметр URL, а дальше его уже обрабатывает операционка, и процесс обработки уже не зависит от Вашей программы.

pva
21-09-2009, 08:43
Если свёрнутое окошко запустить - покатит? ShowState = WS_MINIMIZED

avmir
21-09-2009, 18:05
Все дело в том, что:
1. при каждом нажатии на такую ссылку открывается новое окно IE и фокус переходит на него;
2. пробовал передавать методу Process.Start параметр ProcessStartInfo:


ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
startInfo.Arguments = link.NavigateUrl;
startInfo.CreateNoWindow = true;

Process.Start(startInfo);

Та же песня :(

Мне нужно, нажать несколько ссылок, потом перейти в окно Эксплорера...

pva
22-09-2009, 13:40
вот так у меня сработало (XP, Explorer 6.0):

void __fastcall TForm1::Button1Click(TObject *Sender)
{
STARTUPINFO start_info = {sizeof(STARTUPINFO),
0, 0, 0, // screen info
100, 100, // position
320, 200, // size,
80, 25, 0, //
STARTF_USEPOSITION|STARTF_USESHOWWINDOW|STARTF_USESIZE,
SW_MINIMIZE};

PROCESS_INFORMATION process_info = {};

if (!CreateProcess(0,
"c:\\program files\\internet explorer\\iexplore.exe http://forum.oszone.net/forum-21.html",
0, 0, // default security
false, // no inheritance
NORMAL_PRIORITY_CLASS,
0, // default environment,
0,
&start_info,
&process_info))
{
ShowMessage("failed");
}
}

скромненько запускается в фоне, свёрнутое, и даже не моргает, что дескать обрати на меня внимание.

сделай то же самое для .net

Arrest
22-09-2009, 17:15
Ээээ...
ShellExecute(0, "open", lpszAdress, 0, 0, SW_SHOWNA);
если я правильно понял задачу, то это решается в одну строку windows api.

avmir
23-09-2009, 00:51
Спасибо pva, но к сожалению я не профессиональный программист - любитель, и с С++ знаком слабо, так что у меня не получится сделать тоже самое в .NET :(

pva
23-09-2009, 06:50
не получится сделать тоже самое в .NET »
попробуй выставить свойство типа flags в STARTF_USESHOWWINDOW. Смысл такой: если в NET просто делается класс-обёртка, и не контролируется поправка этого свойства при изменении других свойств, то ты подал команду: запустить процесс, минимизировать окно, но не использовать информацию о том, что ты хочешь его минимизировать. У меня нет описания нетовских классов под рукой, поэтому как оно называется точно сказать не могу. Но должно быть что-то вроде flags или mask.

#define STARTF_USESHOWWINDOW 0x00000001
#define STARTF_USESIZE 0x00000002
#define STARTF_USEPOSITION 0x00000004
#define STARTF_USECOUNTCHARS 0x00000008
#define STARTF_USEFILLATTRIBUTE 0x00000010
#define STARTF_RUNFULLSCREEN 0x00000020 // ignored for non-x86 platforms
#define STARTF_FORCEONFEEDBACK 0x00000040
#define STARTF_FORCEOFFFEEDBACK 0x00000080
#define STARTF_USESTDHANDLES 0x00000100

то есть тебе его надо установить в 1

или

если сможешь использовать ShellExecute, предложенный arrest, получится то же самое, но без бубна




© OSzone.net 2001-2012