delphi4arab منتديات دلفي للعرب
هل يمكن جلب hWindow من خلال dwProcess,hProcess ؟ - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : هل يمكن جلب hWindow من خلال dwProcess,hProcess ؟ (/showthread.php?tid=4938)



هل يمكن جلب hWindow من خلال dwProcess,hProcess ؟ - ALmuhhnad - 21-02-2013

السلام عيلكم ورحمة الله وبركاته

هل يمكن جلب hWindow من خلال dwProcess,hProcess ؟

الحالة ...:
لدي ملف تنفيذي 'C:\target.exe' واستعملت عليه الامر CreateProcess لتشغيلة
وخزنت معلومات العملية في المتغير :
TempProcessInfo
ومعلومات بدء التشغيل او ما يعرف بـ Startupinfo :
TempStartupInfo

وهذا الامر الذي استعملته :
PHP كود :
FillChar(TempProcessInfo,SizeOf(TProcessInformation),#0);
   
FillChar(TempStartupInfo,SizeOf(TStartupInfo),#0);
   
TempStartupInfo.cb := SizeOf(TempStartupInfo);
   
CreateProcess(PWideChar('c:\Target.exe'),nil,nil,nil,False,0,nil,PWideChar(' C:\'),TempStartupInfo,TempProcessInfo); 


الآن من خلال المعطيات السابقة كيف احصل على الـ hWindow الخاص بالعملية التي قمت بتحميلها من خلال
CreateProcess ؟؟

لا أريـ د استعمل ... FindWindow ... حيث اني سافتح اللملف 'C:\target.exe' اكثر من مره لذلك سيكون
هناك العديد من النوافذ التي تحمل نفس الاسم ....

اتمنى اوصلت الفكرة P:

لدي حل لكنه معقد لأعبد حد من وجهة نظري ههه .... طرحت السؤال هنا لاجد حلول آخرى او دوال تعمل هذه الوضيفة

وشكراً لحسن القراءة


هل يمكن جلب hWindow من خلال dwProcess,hProcess ؟ - SMP3 - 22-02-2013

في الحقيقة لا توجد دالة مباشرة للقيام بذلك
يتوجب عليك استخدام الدالة EnumWindows ثم الحصول على مقبض البروسس باستخدام الدالة GetWindowThreadProcessId أو أي دالة أخرى .. ثم مقارنة النتيجة مع متغير يحمل ال PID الخاص ب Target
--------------------
حاليا لن أستطيع أن أعمل لك مثال لأني على جهاز آخر


هل يمكن جلب hWindow من خلال dwProcess,hProcess ؟ - ALmuhhnad - 22-02-2013

إقتباس : يتوجب عليك استخدام الدالة enumwindows ثم الحصول على مقبض البروسس باستخدام الدالة getwindowthreadprocessid أو أي دالة أخرى .. ثم مقارنة النتيجة مع متغير يحمل ال pid الخاص ب target

هذا ما كنت الطريقة التي كنت سافعلها ... ويبدو انه لا مفر منه ... شكراً لإجاابتك استااذ smp3
سيسهل علي الامر لو استعملت FindWindow وبدات بعملية مقارنة الـ PID بالذي املكه ... لاني أريـ د نافذة معينه وليس كل البرامج Smile


هل يمكن جلب hWindow من خلال dwProcess,hProcess ؟ - ALmuhhnad - 23-02-2013

انتظر المثال منك او من احد الاخوة ... يبدو اني لم استطع التعامل مع EnumWindows بشكل سليم حيث اني لم يسببق ان تعااملته معها P:
كل ما اجدلها على الانترنت امثل بلغة الـ C++ رغم اني طبقتها في لغة الدلفي لكنها لم تعمل كما اردت ...


هل يمكن جلب hWindow من خلال dwProcess,hProcess ؟ - ALmuhhnad - 24-02-2013

الحمد لله وجدت الطريقة لعمل ذلك Smile

وهذه الدالة التي قمت ببرمجتها لعمل بحث عن hWindow باخذ dwProcessID و WinTitle
هذه الدالة :
PHP كود :
var
  
sTitle : string;
  
dwProcessID : Integer;
  
RetHandle : HWND;
function 
GethWndByPID(dwPID:Integer ; Title:String):HWND ;

function 
EnumWindowsProc(hHandle: HWND; Info: lParam): BOOL; stdcall;
var
  
sLength : Integer;
  
PID : Integer;
  
WinCaption: string;
begin
  Result 
:= true;
  
GetWindowThreadProcessId(hHandle,@PID);
  if 
PID = dwProcessID then
  begin
    sLength 
:= GetWindowTextLength(hHandle);
    
SetLength(WinCaption, sLength);
    if 
GetWindowText(hHandle,PWideChar(WinCaption), sLength + 1) > 0 then
    begin
      
if WinCaption = sTitle then
      begin
        RetHandle 
:= hHandle;
        
Result := False;
      
end;
    
end;
  
end;
end;

begin
  dwProcessID 
:= dwPID;
  
sTitle := Title;
  if 
EnumWindows(@EnumWindowsProc, 0) = True then
    RetHandle 
:= 0;
  
Result := RetHandle;
end; 

وهذا الاستعمال :
PHP كود :
TargetWinHandle := GethWndByPID(dwProcessId,'TitleWindow'); 

لا اعلم إذا كان هناك طريقة اسهل او افضل من هذه لكن هذا ما استطعت عمله ...
والسلام عليكم ورحمة الله وبركاتة