الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

فكرة لخروج عن الروتين ةتنشيط الفكر...

مغلق
بدأه إسماعيل ابراهيم في 25 مايو 2002 · 9 رد · 577 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم...

أرجو أن تنتال فكرتي هذه إجابكم .. وتفاعلكم...

إسم الفكرة هو :أفكار برمجية.

وتعتمد على طرح أسئلة حول برامج موجودة ومناقشة الافكار التي يرتكز عليها البرنامج (أنا لا أملك حلول للأسئلة لكنها للتداول وابداء الرأي)

مثال :

إسم البرنامج: Don't Panic

وظيفته : يقوم هذا البرنامج بإخفاء كل النوافذ المفتوحة ويخفيها أيضا من شريط المهام بحيث يبدو للناظر أن الكمبيوتر لا يوجد فيه لا برامج تعمل ولا نوافذ مفتوحة (كأنك لسة مشغل الكمبيوتر ومش مشغل ولا برنامج ولا فاتح ولا نافذة). وبضغطة زر تعود كل المخفيات للظهور!

السؤال : كيف قام المبرمج بعملية الاخفاء هذه : ما هي الافكار البرمجية التي اعتمد عليها؟

[كل يبدي رأية فربما يكون الجواب ليس صحيحا لكنه يبقى فكرة ربما تستخدم في برامج أخرى!!](f)

#2

السلام عليكم

بالنسبه لفكره اخفاء النوافذ المفتوحه و اعادتها يمكن استخدام الداله ShowWindow

 ShowWindow(whandle,SW_HIDE);
//-----------------
 ShowWindow(whandle,SW_SHOWNA);

عليك اولا ان تحصل على جميع النوافذ المفتوحه سواء الظاهره او الموجوده في TaskBar - اي IsWindowVisible او IsIconic- .

البرنامج الذي ذكرته يستثني desktop فلا يخفيها , عليك اضافه شرط لذلك ان شئت , ربما تكون هناك حالات اخرى تتم معالجتها كحالات استثنائيه .....

حظ موفق . (f)

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#3

رائع أخي رائع...

لم أتوقع أن الأمر سهل الى هذه الدرجة!!!

حقيقة أنا في فترة إنتقالية من سي++ الى فيجيوال سي++ لهذا لدي سؤال (ثم نعود بعده للموضوع الرئيسي "أفكار برمجية")

هل يمكن لبرنامجي التحكم في نوافذ البرامج الاخرى بهذه السهولة. وكيف أحصل على الـhandle لنوافذ البرامج الاخرى؟؟

#4

السلام عليكم

يمكنك اخي العزيز الوصول الى البرامج الاخرى والتحكم بها عن طريق دوال ال api , حاول تراجع الـSDK HELP , هناك العديد من الدوال

Window Functions , Window Class Functions ...

ضع سؤالك او فكرتك بصورة مباشره - مثلا تريد التحكم بنافذه ذات اسم XX او التحكم بجميع النوافذ لبرنامج notepad مثلا ,... - , و ان شاء الله الاخوة ما راح يقصرون .

بالنسبه للموضوع السابق هذا مثال عليه لكنه console application , انا فضلت جعله console ليكون مفهوم للجميع ولا يؤثر اختلاف الـcompiler المستخدم ..

طبعا هناك اجزاء من الكود يمكن الاستغناء عنها .

//  Compiled by Visual C++6.0 & C++ builder5.0 on winxp
#include 
#include 
#include 
#include 
HWND whandle[256]; 
int count=0;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);

int main(int argc, char* argv[])
{
	printf("Hide ? ");
	int lParam=getchar();
	if (lParam=='Y'||lParam=='y')
		lParam=1; //enumerate & hide
	else
		lParam=0; //enumerate with hidding
	getchar(); // Why ? You try to find the reason :D 
	EnumWindows(&EnumWindowsProc,lParam); //Hide
	if(lParam==1) //Unhide
	{
		printf("Press anykey to unhide ...n");
		getch();
		for(int i=0;i<=count;i++)
			ShowWindow(whandle,SW_SHOWNA);
	}
	printf("Press any key to halt ...n");
	getch();
	return 0;
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
	char Buffer[256];
	if( IsWindowVisible(hwnd) /*|| IsIconic(hwnd)*/)
	//You try to keep the condition IsIconic & check the different
	{
		if(lParam==1)
		{
			whandle[count]=hwnd;
			count++;
			GetClassName(hwnd,Buffer,256);
		if(	
			//Desktop
			strcmp(Buffer,"Progman")&
			//Our program
			(hwnd!=GetForegroundWindow()) & 
			//TaskBar
			strcmp(Buffer,"Shell_TrayWnd")
		  )
			ShowWindow(hwnd,SW_HIDE);
	}
//------- Show handle & Caption of windows---
	GetWindowText(hwnd, Buffer, 256);
	if(strlen(Buffer)== 0 )
		strcat(Buffer , "Empty");
	printf("%dt%sn",hwnd,Buffer); 
//-------------------------------------------
}
return true;
}

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#5

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

يمكنك الحصول على ال handle للنوافذ الأخرى عن طريق استخدام الدالة التالية

FindWindow(

   LPCTSTR lpszClassName,

   LPCTSTR lpszWindowName 

);

وتعود هذه الدالة بال handle للنافذة الأم parent

وللحصول على ال handle للنافذة الوليدة او child window فيمكنك استخدام الدالة التالية

FindWindowEx(

   HWND hwndParent,

   HWND hwndChildAfter,

   LPCTSTR lpszClass,

   LPCTSTR lpszWindow

);

وهذا مثال على كيفية استخدامها فهذا المثال يقوم بإخفاء ال start button

مثال

HWND hTray = ::FindWindow("Shell_TrayWnd", NULL);

if(hTray)

{

// الحصول على handle ال start button 

HWND hStart = ::FindWindowEx( hTray, NULL, "Button", NULL);



if(hStart)

{ 



::ShowWindow(hStart, FALSE);

} 

}

حيث قمنا أولا بإيجاد ال handle لل Shell_TrayWnd وهو ال taskbar

ومن ثم ايجاد ال handle لل start button وهو نافذة وليدة من ال task bar وبإستخدام ShowWindow() قمنا بإخفاءه

ولإظهاره مرة أخرى

ShowWindow(hStart, TRUE);
#6

ممتاز ازادكم الله..

أخواني والله رائع..

لكن :

كيف نعرف إسم النافذة ونحن لا نملك عنها من المعلومات غير إسمها الظاهر أعلى النافذة, وأحيانا لا يتوفر حتى هذا الاسم..

مثلا زر إبدأ : وشريط المهام كيف عرفت أخي أسمائها؟؟

وشكرا

#7

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

أخ اسماعيل توجدأداة في داخل حزمة Visual studio6 تحمل إسم spy++ تستطيع من خلالها الحصول على اسم الكلاس الذي تريده فقط شغل أداة spy++ واضغط ctrl+m لتظهر لك نافذة message option ,ستجد بداخلها مربع صغير وفي وسطه دائرة (finder tool( ، اضغط على الأداة واسحبها الى أي نافذة تريد لترى اسم الكلاس الذي ستستخدمه في الحصول على ال handle للنافذة التي تريد إضافة الى الكثير من المعلومات المهمة

مثال

جرب سحب الأداة الى التاسك بار فسوف تحصل على اسم الكلاس وهو Shell_TrayWnd ومن ثم اسحبها الى زر start button فستحصل على اسم الكلاس لل start button وهو Button

وبما أن ال task bar هو الكلاس الرئيسي فإننا نجد قيمة ال handle له هكذا

HWND hMain;
hMain=::FindWindow("Shell_TrayWnd",NULL);

وبعدها نجد ال handle لل start button وهو كلاس مشتق من الكلاس الرئيسي وهو ال task bar

HWND hSub;
hSub=::FindWindowEx(hMain,NULL,"Button",NULL);

وبعد ذلك نستطيع التعامل مع النافذة

أرجوا أن أكون قد أفدت

#8

السلام عليكم

اضافه بسيطه الى ما قاله الاخ mhammad , يمكن ان تكتب برنامج يقوم بالعمل الذي يقوم به Spy++ باستعمال دوال الـ api .

هناك كود كنت كتبته بالدلفي يمكن الاطلاع عليه يوضح الفكره السابقه التي يقوم بهاSpy++ ...

انصحك بمراجعة MSDN Help ومحاولة عمل امثله لدوال الـapi حتى تاخذ فكره عنها بشكل عام ..

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#9

شكرا جزيلا أخ tmaaa

شكرا جزيلا أخ محمد..

جزاكما الله عني ألف الف خير

والله معلومات قيمة جداً ...

بخصوص ++spy معلومة جميلة وقيمة..

جزاكما الله ألف خير.. وساحاول البحث عن الدوال التي تقوم بعمل

ال++spy كما نصح tmaaa ..

................................................. مش عارف أيش اقول لو بدي أشكركم لازم أعبي كل المنتدى شكر...

لكن بإختصار.. جزاكما الله خيرا!

#10

لا شكر على واجب أخ إسماعيل ونحن بإنتظار أفكار برمجية أخرى

(f) (f) (f)

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…