ورود

View Full Version : پیدا کردن classname و windowCaption برنامه ها



fire.angle
شنبه 01 آبان 1389, 21:26 عصر
سلام

لطفآ یکی کمک کنه که چطور Class Name , Window Caption, Handle برنامه ها رو بدست آورد ؟

با تشکر

mehdi.mousavi
شنبه 01 آبان 1389, 23:47 عصر
سلام لطفآ یکی کمک کنه که چطور Class Name , Window Caption, Handle برنامه ها رو بدست آورد ؟ با تشکر

سلام.
شما می تونید با
(http://msdn.microsoft.com/en-us/library/ms633582%28VS.85%29.aspx)

GetClassName (http://msdn.microsoft.com/en-us/library/ms633582%28VS.85%29.aspx) اسم کلاس Windowing رو بگیرید
GetWindowText (http://msdn.microsoft.com/en-us/library/ms633520%28v=VS.85%29.aspx) عنوان (یا همون Caption) پنجره رو بدست بیارید
استفاده از Enumerate کردن Process ها (http://msdn.microsoft.com/en-us/library/ms684865%28VS.85%29.aspx) نیز Handle به پروسه مورد نظر رو پیدا کنید. البته روشهای دیگه ای نیز برای رسیدن به Handle یک Process وجود داره که در MSDN می تونید پیدا کنید.

موفق باشید.

پاورقی: اگر منظورتون در MFC بودش، برای اولی میتونید از CObject::GetRuntimeClass() استفاده کنید. CRuntimeClass یه Member داره به اسم m_lpszClassName که اون Class Name رو بهتون میده. به همین ترتیب، GetWindowText روی CWnd (http://msdn.microsoft.com/en-us/library/db50wx7h.aspx) نیز تعریف شده...

fire.angle
دوشنبه 03 آبان 1389, 00:03 صبح
سلام

مدیر محترم متشکرم

ولی ... این دو تابع هر دوشون Handle پنجره رو می خوان

پس باید یه جوری Handle رو به دست بیارم ولی با استفاده از تابع Find Window نمیشه این کار رو کرد چون خود Find window به عنوان آرگومان ورودی Class Name و Window Caption رو می خواد

پس لطفآ بگید چطور Handle یک پنجره رو بدست بیارم .

r00tkit
دوشنبه 03 آبان 1389, 00:19 صبح
ببین دوست من تو ریاضی /فیزیک هم برای بدست اوردن مجهول ها ما چند تا معلوم هم داشتیم

خوب تو برنامه نویسی هم همین جوریه دیگه باید معلومات بدی تا محهولات رو بگیری
شما چی چیزی رو به عنوان معلوم داری و مجهولش چی هستش تا توضیح بدیم

اگه msdn رو خوب می خوندی در findwindow می تونی به جای window class از NULL استفاده کنی

fire.angle
سه شنبه 04 آبان 1389, 10:35 صبح
سلام

من میخوام برنامه ای بنویسم تا هندل پروس های در حال اجرا و یا پنجره ها یا برنامه هایی که کاربر بر روی آنها کلیک میکند رو بدست بیارم

برای بدست آوردن هندل به Class name و Window caption نیازه

حالا من که نمیدونم کاربر قراره روی چه پنجره ای کلیک کنه چطور میتونم هندلش رو بدست بیارم ؟؟؟؟؟

Felony
سه شنبه 04 آبان 1389, 10:52 صبح
تابع GetForegroundWindow هندل پنجره فعال رو بهتون میده .

r00tkit
سه شنبه 04 آبان 1389, 17:05 عصر
سلام

من میخوام برنامه ای بنویسم تا هندل پروس های در حال اجرا و یا پنجره ها یا برنامه هایی که کاربر بر روی آنها کلیک میکند رو بدست بیارمو /یا این جمله غلط نیست؟

با این کد می تونی به لیست پروسس های در حال اجرا برسی و البته یه هندل بهشون : ToolHelp

البته با PSAPI هم می شه که استاد موسوی اشاده کردن

سوال : handle چیست؟ جواب :کتاب windows via c/c++ فصل 2 { این سوال اگه جوابش رو ندونیم نمی تونیم کد بزنیم }
برای ان قسمت کلیک کردن هم یه چیز در زهنمه که اگه شد می نویسم ( کلیک موس رو هوک کنی بعد توی hookproc هندل رو بدست بیاری ) استاد موسوی راه حل جواب داره ؟


#include<Windows.h>
#include<stdio.h>
#include<iostream>
#include <TlHelp32.h>

int main()
{

PROCESSENTRY32 psh;
psh.dwSize=sizeof(PROCESSENTRY32);
HANDLE snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCE SS,0);//TH32CS_SNAPPROCESS

if( snapshot==INVALID_HANDLE_VALUE )
{
printf("error %i",GetLastError());
}


if( !Process32First( snapshot, &psh ) )
{
printf( "Process32First" ); // Show cause of failure
// snapshot object!
return( FALSE );
}


while(Process32Next(snapshot,&psh))
{

//printf("file is %s \n",psh.szExeFile);
//printf("process id is %i \n ",psh.th32ProcessID);

HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, psh.th32ProcessID );

printf("handle is %i \n",hProcess);

CloseHandle(hProcess);


}

printf("e %i",GetLastError());

CloseHandle(snapshot);

}

هر چند 1نیم سال از نوشتن اولین برنامهی عمرم می گذره (hello world) اما ورود خودم رو به دنیای برنامه نویسی تبریک می گم :قهقهه::لبخند::متفکر::بامزه:

mehdi.mousavi
سه شنبه 04 آبان 1389, 17:58 عصر
سلام برای ان قسمت کلیک کردن هم یه چیز در زهنمه که اگه شد می نویسم ( کلیک موس رو هوک کنی بعد توی hookproc هندل رو بدست بیاری ) استاد موسوی راه حل جواب داره ؟

سلام.
البته که میشه. کافیه تا idHook رو WH_CALLWNDPROC بذارید (تا همه Message ها رو قبل از اینکه به دست App مربوطه برسه به دام بندازید) و سپس اگر پیام مربوطه WM_ACTIVATE (http://msdn.microsoft.com/en-us/library/ms646274%28v=VS.85%29.aspx) بود، اونوقت بقیه جریان رو پیش ببرید (البته می تونید از WM_ACTIVATEAPP (http://msdn.microsoft.com/en-us/library/ms632614%28VS.85%29.aspx) نیز استفاده کنید).

موفق باشید.

vcldeveloper
چهارشنبه 05 آبان 1389, 23:04 عصر
ولی ... این دو تابع هر دوشون Handle پنجره رو می خوان

پس باید یه جوری Handle رو به دست بیارم ولی با استفاده از تابع Find Window نمیشه این کار رو کرد چون خود Find window به عنوان آرگومان ورودی Class Name و Window Caption رو می خواد

پس لطفآ بگید چطور Handle یک پنجره رو بدست بیارم .
با استفاده از تابع EnumWindows برای پنجره های Top-level و EnumChildWindows برای پنجره های فرزند.

fire.angle
پنج شنبه 06 آبان 1389, 00:15 صبح
سلام

آقای کشاورز و سایر دوستان عزیز متشکرم

برنامه ای که در قسمت برنامه نویسی دلفی قرار داده بودید کاملا به سوال من پاسخ داد

متشکرم

اگر بتونید و یک برنامه برای تابع Enum Window هم ارایه بدید تا با طرز کار اون هم آشنا بشیم بسیار ممنون و متشکرم می شوم

انگلیسی مون خوب نیست (msdn که بدون مثال باشه فهمیدنش یکم سخته)

Felony
پنج شنبه 06 آبان 1389, 03:09 صبح
سلام

آقای کشاورز و سایر دوستان عزیز متشکرم

برنامه ای که در قسمت برنامه نویسی دلفی قرار داده بودید کاملا به سوال من پاسخ داد

متشکرم

اگر بتونید و یک برنامه برای تابع Enum Window هم ارایه بدید تا با طرز کار اون هم آشنا بشیم بسیار ممنون و متشکرم می شوم

انگلیسی مون خوب نیست (msdn که بدون مثال باشه فهمیدنش یکم سخته)

تابع ( دلفی ) :

function EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall; export;
var
Title, ClassName: array[0..255] of char;
begin
Result := True;
GetWindowText(wHandle, Title, 255);
GetClassName(wHandle, ClassName, 255);
if IsWindowVisible(wHandle) then
lb.Items.Add(string(Title) + '-' + string(ClassName));
end;

استفاده :
EnumWindows(@EnumWindowsProc, Integer(Listbox1));

fire.angle
پنج شنبه 06 آبان 1389, 10:41 صبح
سلام
آقای تاجیک متشکرم

ولی لطفآ توضیح بدید که این w Handle از کجا مقدار دهی میشه ؟ (شماره هندل ها تولید میشوند )

و آیا تابع Api ای برای اینکه این کار رو انجام بده وجود داره یا باید حتمآ تابع تعریف کنیم ؟

r00tkit
شنبه 08 آبان 1389, 19:09 عصر
سلام.
البته که میشه. کافیه تا idHook رو WH_CALLWNDPROC بذارید (تا همه Message ها رو قبل از اینکه به دست App مربوطه برسه به دام بندازید) و سپس اگر پیام مربوطه WM_ACTIVATE (http://msdn.microsoft.com/en-us/library/ms646274%28v=VS.85%29.aspx) بود، اونوقت بقیه جریان رو پیش ببرید (البته می تونید از WM_ACTIVATEAPP (http://msdn.microsoft.com/en-us/library/ms632614%28VS.85%29.aspx) نیز استفاده کنید).

موفق باشید.

استاد موسوی اگه قراره برای hook گلوبال از یه dll جدا استفاده، بعدش:


همون : LoadLibrary بعد GetProcAddress بعدشم SetWindowsHookEx خوب تو اینجا دیگه به برنامه ما چه ربطی داره برنامه ی ما فقط hook رو نصب می کنه ان proc تو dll هستش

باید از dll هندل رو بفرستم به برنامه اصلی با چیزی مثل SendMessage

یا راه دیگه ای وجود داره ( مثلا" ارگومان دوم تابع SetWindowsHookEx یه تابع تو برنامه خودمون باشه نه dll جدا این امکان وجود داره )

یه سوال دیگه : یه key loger که global hook هستش(؟) چی جوری بدون dll جدا به پیام ها گوش و هندلشون می کنه ؟

------------------------
ممنون

r00tkit
شنبه 08 آبان 1389, 21:44 عصر
یه سوال دیگه : یه key loger که global hook هستش(؟) چی جوری بدون dll جدا به پیام ها گوش و هندلشون می کنه ؟

------------------------
ممنون


WH_KEYBOARD_LL != WH_KEYBOARD

the WH_KEYBOARD_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event

با تشکر از استاد مهدی موسوی

mehdi.mousavi
دوشنبه 10 آبان 1389, 15:28 عصر
سلام.
شما می تونید تابعی به اسم InstallMyHook (البته بدون شک اسمی که انتخاب می کنید باید اسم معناداری باشه، من فقط برای اینکه شما منظور منو دقیق متوجه بشید این اسم رو انتخاب کردم) در DLL اتون داشته باشید که حداقل یک پارامتر HWND بگیره. این تابع که توسط EXE ی شما Call خواهد شد، هنگام فراخوانی، Handle به پنجره ای که علاقمند هستش Message های دریافتی (خواه Custom باشه، خواه نه!) از DLL رو در اون پردازش کنه، پاس میکنه. سپس توی همین تابع InstallMyHook، شما باید Handle دریافت شده رو Cache کنید تا بتونید توی Window Proc مورد نظر (که نشوندهنده پیامهای دریافتی هستش و در DLL شما تعریف شده)، پیام Customized ای به اون Window ارسال کنید (PostMessage). سپس در EXE ی برنامه، شما انتظار دریافت اون Custom Message رو دارید، که به محض Dispatch شدن، Handler ای می تونید براش تعریف کنید که از جزییات اون پیام (که توسط اون Custom Message از سمت DLL برای شما پست شده) مطلع بشید. بدین ترتیب پیام دریافت شده در DLL رو به دست Process خودتون رسونده اید.

البته روشهای بسیار زیادی برای اینکار وجود داره که خوب، بستگی به سناریوی در دست باید یکی از اون روشها رو انتخاب کرد.

بطور کلی، وقتی شما DLL مورد نظر رو Load می کنید، در واقع دارید اون DLL رو به Address Space پروسه خودتون Map می کنید. بطور پیش فرض، کلیه Process هایی که از اون DLL استفاده میکنن، متغیرهای Global خودشون رو دارن، یعنی اگر تو یکی از اون پروسه ها متغیر Global ای در DLL رو دستکاری کنید، این تغییر به Instance های دیگه از اون DLL در Process های دیگه Propagate نمیشه. برای اینکه بتونید داده ای رو بین DLL و Process خودتون به اشتراک بذارید بگونه ای که تغییر در یک متغیر Global باعث تغییر در کلیه Instance های متفاوت اون DLL که توسط Process های دیگه نیز Load شده بشه، چند راه دارید... یک روش خوب برای اینکار، اینه که از named data segment (http://msdn.microsoft.com/en-us/library/thfhx4st%28v=VS.100%29.aspx) ها استفاده کنید. استفاده از Memory Mapped File ها نیز روش خوب دیگه ای برای اینکاره.

در کل، شما مجبور نیستید که از طریق Windowing System کارتون رو پیش ببرید و باید بر اساس صورت مساله، راه مناسب رو انتخاب کنید. در صورت مساله فعلی، استفاده از PostMessage و تعریف یک Custom Message کار رو بخوبی پیش میبره و نیازی به استفاده از متودهای دیگه نیست.

موفق باشید.