Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2016.02.14;
Скачать: [xml.tar.bz2];

Вниз

дискриптор окна mstsc, не реагируют на функцию SetForegroundWind   Найти похожие ветки 

 
FIL-23   (2014-07-16 14:37) [0]

пишу код в котором проверяется не запущена ли программа (PID программы храниться в масиве), и если не запущенна то запускаем, запуск идет через CreateProcess по такой цепочке powershell -> cmd -> mstsc ... я нахожу PID нужного мне mstsc, по PID нахожу Дискриптор окна... и пытаюсь провести с ним какие либо манипуляции - сфокусироват или развернуть, но ни чего не происходит. Только фокус с моей делфивской проги пропадает, а фокус на mstsc не идет.

Примерно по такому же принцыпу запускаю и putty только там сразу через CreateProcess putty запускается...

Но я тоже узнаю дискриптор окна putty, по нему делаю фокус или разворачиваю, и в этом мементе все ок.

У кого какие мылси? Почему mstsc не хочет фокусироваться?


 
junglecat   (2014-07-16 14:43) [1]

> Почему mstsc не хочет фокусироваться?

уверен, что нашел именно нужный дескриптор окна?


 
brother ©   (2014-07-16 14:48) [2]

> У кого какие мылси?

даж не знаю что и сказать... хоть код покажите...


 
FIL-23   (2014-07-16 15:06) [3]

Вот тут идет сначало проверка запущен процесс или нет, если нет , то запускаем , а потом ищем PID процесса


procedure ConnectOnRDP(perUSER,perPASS,perCOMP:string);
var
perParam:string;
perHINST:longword;
SI: TStartupInfo;
PI: TProcessInformation;
PIDchild:Cardinal;
begin
if ZHIV_LI_PROCESS(TreeViewItemIndex)=false  //проверка жив ли процесс , если не жив , то создаем процесс
 then
   begin
   FillChar(SI, SizeOf(SI), 0);
   SI.cb := SizeOf(SI);

   perParam:=
         "$user="+""""+ perUSER +"""" +#10#13+             //задаем логин
         "$pass="+""""+ perPASS +"""" +#10#13+             //задаем пароль
         "$comp="+""""+ perCOMP +"""" +#10#13+             //задаем адрес
         "cmdkey /generic:"TERMSRV/$comp" /user:"$user" /pass:"$pass"" +#10#13+   //вносим логин и пароль в хер знает куда .. но он там лежит и при вызове mstsc он им воспользуется
         "mstsc /v:"+"$comp"+#10#13;     //вызываем программу удаленых рабочих столов
     CreateProcess(nil,pchar("Powershell.exe "+perParam),0,0,false,0,0,0,SI,PI);
     WaitForSingleObject(PI.hProcess, INFINITE);   //ждем пока отработает POWERSHELL
     PIDchild:=Get_PIDchild_process(Get_PIDchild_process(PI.dwProcessId));   //тут надо два ажна два потомка искать ) ... сначало - powershell ->cmd -> mstsc
     MAS_PID_PROCESS[TreeViewItemIndex]:=PIDchild;  //записываем PID процесса , ид записи таблицы //причем PID потомка, который ищется через PID родителя.
   end;
end;


Эта функция ищет дочерний PID ...

function Get_PIDchild_process(PIDparent:Cardinal):Cardinal;
var
 HandleSnapShot      : THandle;
 EntryParentProc     : TProcessEntry32;
 fnd: boolean;
begin
result := 0;    //если процесс не существует
HandleSnapShot     := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//делаем снапшот процессов или чего там (короче диспетчера задач)
EntryParentProc.dwSize := SizeOf(tagPROCESSENTRY32);     //я так понимаю загоняем все значения PID родителей у дочерних процессов в "массив"
fnd := Process32First(HandleSnapShot, EntryParentProc); // Находим первый процесс.

while fnd do // Цикл перебора всех процессов в системе.
 begin
 if EntryParentProc.th32ParentProcessID = PIDparent then   //если найден процеесс у которого родитель его то
   begin
   fnd := false; //заканчиваем цыкл
   result := EntryParentProc.th32ProcessID;  //возвращааем PID процесса потомка
   end;

 fnd := Process32Next(HandleSnapShot, EntryParentProc);  // Схожий процесс не найден, продолжаем перебор
 end;
CloseHandle(HandleSnapShot);  // Закрываем наш снепшот.
end;


А тут ищем дискриптор окна, и возращает его в глобальную переменную g_hWnd: HWND;

//функция ищет по PID процесса ЗАПУЩЕННЫЙ ПРОЦЕСС, а потом возращает его ДИСКРИПТОР окна
function FindFunc(h:hwnd; lparam:LPARAM):boolean;stdcall;
var
dwPID:DWORD;
begin
GetWindowThreadProcessId(h,@dwPID);

if dwPID=DWORD(lparam) then
 begin                 //если нашли процесс по PID , то назад
 g_hWnd:= h;
 result:=false;
 ShowMessage("ДЕСКРИПТОР НАЙДЕН");
 end;
result:=true;
end;


 
FIL-23   (2014-07-16 15:08) [4]

не правильно написал, первая процедура запускает приложение .. предворительно проверив не запущено ли оно было ранее..

а вот этот проверяет .. запущен он ранее или нет

function ZHIV_LI_PROCESS(index:integer):boolean;
begin
result:=false;// процесс уже не жив,
if MAS_PID_PROCESS[index]>0 then  //если был запущен когда то процесс, проверяем, не завершен ли он
if  AnotherProcessExists(MAS_PID_PROCESS[index])=true then  //если процесс еще жив, то
 begin
 EnumWindows(@FindFunc,MAS_PID_PROCESS[index]); // запускаем перечисление дабы найти дискриптор окна
 //ShowWindow (g_hWnd,SW_RESTORE);
 if IsIconic(g_hWnd) then ShowWindow(g_hWnd, SW_SHOWNORMAL);   //если окно свернуто разворачиваем его
 SetForegroundWindow(g_hWnd);  //выводим на передний план
 result:=true;
 end

end;



//проверка ,запущен ли процесс, если запущен то ппц))
function AnotherProcessExists(my_pid: Cardinal):boolean;
var h: Cardinal;
   p: tagPROCESSENTRY32;
   fnd: boolean;
   my_name, pr_name: string;

begin
result := false;    //если процесс не существует
 // Узнаём свой PID
 // Делаем снепшот системы.
 h := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 p.dwSize := SizeOf(tagPROCESSENTRY32);
 // Находим первый процесс.
 fnd := Process32First(h, p);
 // Цикл перебора всех процессов в системе.

 while fnd do
 begin
   // с PID-ом нашего процесса.
   if(my_pid=p.th32ProcessID)then
   begin

     // Вторая копия нашей программы уже существует,
     // заканчиваем цикл и выходим.
     fnd := false;
     result := true;
   end else
     // Сходий процесс не найден, продолжаем перебор
     fnd := Process32Next(h, p);
 end;
 // Закрываем наш снепшот.
 CloseHandle(h);

end;


 
DVM ©   (2014-07-16 16:33) [5]


> провести с ним какие либо манипуляции - сфокусироват или
> развернуть, но ни чего не происходит. Только фокус с моей
> делфивской проги пропадает, а фокус на mstsc не идет.

И не будет, на передний план окно не выскочит и фокус не получит. Поведение этой функции в Windows уже давно изменено таким образом.

попробуй так, может еще работает:
http://delphimaster.net/view/4-1255362446/


 
ВладОшин ©   (2014-07-16 18:00) [6]


> DVM ©   (16.07.14 16:33) [5]


а простого BringWindowToTop недостаточно что ли?


 
FIL-23   (2014-07-16 20:21) [7]

спасибо за ответы но
DVM, там говориться про то что если окно свернуто,

ВладОшин, не плохо, но окно становиться активно если его сам второй раз нажал, после этого функция срабатывает, короче что то не то...\

я попробовал просто по PID процессу из диспетчера задач .. найти дискриптор окна, с блокнотом получилось , все ок отработало .. но вот с mstsc вообще вилы , не хочет и все тут...


 
DVM ©   (2014-07-16 22:48) [8]


> FIL-23   (16.07.14 20:21) [7]


> DVM, там говориться про то что если окно свернуто,
>

ты попробуй то, что я там написал.


 
DVM ©   (2014-07-16 22:57) [9]


> ВладОшин ©   (16.07.14 18:00) [6]

фокус ввода оно не получит


> я попробовал просто по PID процессу из диспетчера задач
> .. найти дискриптор окна

у тебя проблема с поиском хэндла окна или его выводом на передний план? Ну возьми для начала Spy++ найди хэндл там, попробуй активизировать окно.


 
FIL-23   (2014-07-17 09:07) [10]


> ты попробуй то, что я там написал.


попробовал, с другими прогами все ок, а с mstsc нет ... проблема остается


> у тебя проблема с поиском хэндла окна или его выводом на
> передний план


проблема с выводом его на передний план...

Сейчас немного попытался вяснить проблему, проблема найдена вот в этом коде (но это не проблема кода)

function FindFunc(h:hwnd; lparam:LPARAM):boolean;stdcall;
var
dwPID:DWORD;
begin
result:=true;
GetWindowThreadProcessId(h,@dwPID);
if dwPID=DWORD(lparam) then
 begin                
 g_hWnd:= h;
 SetForegroundWindow(g_hWnd);
 //result:=false;
 end;
end;


оказывается у mstsc несколько одинаковых PIDов я насчитал 16 штук, и если функцию SetForegroundWindow вынести за цыкл, то она не отработает, т.к. нужный хэндл находится во 2ой 9ой и еще каких то позициях.. я ни чего вообще не понимаю.


 
FIL-23   (2014-07-17 09:30) [11]

в общем сделал , с горем пополам ... спасибо DVM за правидный код :)


 
megavoid ©   (2014-07-17 11:32) [12]

FIL-23, винда у вас х64? PIDы у mstsc могут расплодиться из-за WOW64 в ней.


 
FIL-23   (2014-07-17 11:35) [13]


> винда у вас х64


да 64 бита.


> mstsc могут расплодиться из-за WOW64 в ней


И как быть?


 
junglecat   (2014-07-17 11:41) [14]

> PIDы у mstsc могут расплодиться из-за WOW64 в ней

с чего бы? mstsc же сам 64-битный


 
FIL-23   (2014-07-17 11:47) [15]


> с чего бы? mstsc же сам 64-битный


я конечно не спец (совсем) ... но может быть от того что у меня программа 32 бита - а она уже тянет за собой все стальное ? ( в системе кстати есть msts 32 разрядный, тут лежит C:\Windows\SysWOW64)


 
junglecat   (2014-07-17 11:54) [16]

> [15] FIL-23   (17.07.14 11:47)

это легко в диспетчере задач проверить
щас попробовал запустить команду powershell mstsc из 32-бит проги - запустился 64-битный



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2016.02.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.002 c
2-1398430105
Дмитрий
2014-04-25 16:48
2016.02.14
Ошибка доступа ODBC и mySQL-connector


2-1406645269
alexdn
2014-07-29 18:47
2016.02.14
Как задать порядок форм


2-1406532286
Dmitry
2014-07-28 11:24
2016.02.14
Как в QuickReport открить отчет для просмта сразу в Preview


15-1433584118
pavelnk
2015-06-06 12:48
2016.02.14
Событие onShow


15-1433362244
d2pak
2015-06-03 23:10
2016.02.14
P-CAD. Редактор УГО





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский