PDA

View Full Version : سوال: نحوه خواندن متن نوار (Titlebar Text) عنوان پنجره های در حال اجرا



gh-reza
پنج شنبه 04 تیر 1388, 01:03 صبح
البته من دو تا برنامه در این باره پیدا کردم که یکیش از EnumWindows استفاده میکنه و بعدی از GetWindowText ولی هیچ کدوم جواب مناسبی رو برای بسیاری از برنامه ها نمیدن، مثلا برای yahoomessenger رشته YWndCallForward، برای explorer رشته Progman، و بهمین ترتیب الی اخر. و فقط در برخی موارد درست کار میکنه. لطفا اگه کسی روشی بلده با ما در میون بزاره.

Nima_NF
پنج شنبه 04 تیر 1388, 14:17 عصر
وقتی از EnumWindows استفاده می کنید، باید هندل هایی که مخفی هستند و یا کلا پنجره نیستند را از لیست پروسه حذف کنید یا به قولی از آن ها صرف نظر کنید، مثلا:



BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
TCHAR strApp[255];

if (!hWnd)
return TRUE;

if (!IsWindowVisible(hWnd))
return TRUE;

GetWindowText(hWnd, strApp, 255);

// Show strApp here

return TRUE;
}

gh-reza
دوشنبه 08 تیر 1388, 14:31 عصر
دوست عزیز مشکل توی همین hwnd که چطور هندلی به پنجره یه برنامه دیگه بدست بیاریم، البته TList: Task List Application Sample یه مثال توی MSDN هست که در همین زمینه ارائه شده، ولی خود این برنامه هم titleها رو به درستی نشون نمیده.

tdkhakpur
دوشنبه 08 تیر 1388, 15:05 عصر
سلام
به نحوه استفاده از تابع زیر در help کامپایلرتان یک نظری بندازید متوجه خواهید شد که تابه hwnd را برای شما ارسال میکند.


BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, // pointer to callback function
LPARAM lParam // application-defined value
);

Nima_NF
دوشنبه 08 تیر 1388, 15:21 عصر
بله، همین طور که جناب tdkhakpur هم توضیح دادند، کلا هدف از فراخوانی EnumWindows و EnumWindowsProc دریافت HWND های مربوط به تمامی پنجره های active هست.
یک بار EnumWindows را فراخوانی می کنید و تابع EnumWindowsProcبه تعداد پنجره های فعال موجود سیستم فراخوانی می شود و در هر فراخوانی یک hwnd به شما می دهد.

gh-reza
پنج شنبه 11 تیر 1388, 02:00 صبح
با تشکر از نظرات و راهنمائی های دوستان، مشکل حل شد و این هم کد مورد نظر برای استفاده سایر دوستان که ممکنه مشکله مشابهی داشته باشن.

#include <stdio.h>
#include <conio.h>
#include <windows.h>
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
if (!IsWindowVisible(hwnd))
return TRUE;
const int maxLen = GetWindowTextLengthW(hwnd)+1;
LPWSTR buffer = new WCHAR [maxLen];
GetWindowTextW(hwnd,buffer,maxLen);
if(wcscmp(buffer,L""))
{
wprintf(buffer);
wprintf(L"\n");
}
return TRUE;
}
void ListWindowTitles(void)
{
HDESK desktopHandle = OpenInputDesktop(0,TRUE,DESKTOP_ENUMERATE);
if(!EnumDesktopWindows(desktopHandle,(WNDENUMPROC) EnumWindowsProc,NULL))
printf("There was an error in enumrating windows");
}/*
void ListWindowTitles(void)
{
if(!EnumWindows((WNDENUMPROC) EnumWindowsProc,NULL))
printf("There was an error in enumrating windows");
}*/
int main(void)
{
ListWindowTitles();
_getch();
}