PDA

View Full Version : حرفه ای: استفاده از توابع API در #C



AlgorithmX
چهارشنبه 25 خرداد 1390, 13:39 عصر
سلام!
اگه تکراریه ببخشید!
چطوری می تونم به توابع DLL سیستم عامل مانند kernel32.dll, user32.dll, .. دستوراتمو ارسال کنم!
اگر هم یک مثال از برنامه هایی که با تواع API کار میکنند بزارید ممنون میشم!

saman6384
چهارشنبه 25 خرداد 1390, 13:57 عصر
http://www.pinvoke.net/

برو اینجا همه چی هس!!

Programmer 1
چهارشنبه 25 خرداد 1390, 14:18 عصر
یک مثال

در اینجا می خواهیم از تابع GetComputerName که در ویندوز به صورت زیر تعریف شده است در برنامه مان استفاده کنیم:

int GetComputerName(LPSTR buffer, LPDWORD size);


به خاطر داشته باشید که LP در ویندوز به معنای Long Pointer است و در مواردی به کار می رود که قرار باشد یک متغیر با آدرس به API ارسال شود. در #C، در صورتی که از انواع Value Type (مثل int، char، float و ...) استفاده می کنید، لازم است قبل از نام متغیر، کلمه کلیدی ref (به معنی reference) را اضافه کنید. در صورتی که از انواع Reference Type (مثل کلاس ها) استفاده می کنید، نیازی به استفاده از این کلمه کلیدی نیست.

بنابراین، با توجه به جدول فوق، می توان تابع ()GetComputerName را به صورت زیر در NET. به برنامه متصل کرد:


public class Win32API
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetComputerName(StringBuilder buffer, ref uint size);
}


DllImport یک Attribute است که به CLR می گوید که این تابع در کجا تعریف شده است. آرگومان دوم این Attribute ، یعنی CharSet = CharSet.Auto برای فراخوانی توابعی که از 2 فرمت ANSI و Unicode استفاده می کنند لازم است. بسیاری از توابع ویندوز (مانند GetComputerName) در 2 فرمت می آیند: GetComputerNameA و GetComputerNameW. در این موارد، لازم است که تشخیص اینکه از کدام نسخه استفاده شود را به CLR واگذار کنید. عبارت CharSet.Auto این کار را به طور اتوماتیک انجام می دهد.

در اینجا، ما یک کلاس به نام Win32API تعریف کرده ایم و توابع API ای که می خواهیم از آنها استفاده کنیم را در این کلاس قرار خواهیم داد. شما هم می توانید API هایی که زیاد با آنها کار می کنید را در یک یا چند کلاس از نظر موضوعی دسته بندی کنید. به چنین کلاسی Wrapper گفته می شود. این تکنیک در نگهداری برنامه ها و استفاده مکرر از کد تاثیر بسزایی دارد.

یک نکته مهم: در هنگام Declare توابع API، توجه داشته باشید که این توابع را باید همواره از نوع static و extern تعریف کنید تا CLR بتواند آن ها را در DLL های مربوطه پیدا کند.

اما نحوه استفاده از این تابع! فرض کنید که می خواهیم اسم کامپیوتر را با استفاده از تابع ()GetComputerName گرفته و در یک رشته به نام ComputerName قرار دهیم. برای این منظور، می نویسیم:


StringBuilder buffer = new StringBuilder(128);
uint size = (uint)buffer.Capacity;
Win32API.GetComputerName(buffer, ref size);
string ComputerName = buffer.ToString();


این هم یه برنامه ساده که خودم نوشتم برای تست ، البته عکسش رو می زارم ، امیدوارم کارتون رو راه بندازه

http://iranxm.webatu.com/images/716d0fc31636.jpg

البته تو همین برنامه نویس و همچنین سایت MSDN هم می تونی اطلاعات بیشتری بدست بیاری

AlgorithmX
چهارشنبه 25 خرداد 1390, 14:53 عصر
http://www.pinvoke.net/

برو اینجا همه چی هس!!


یک مثال

در اینجا می خواهیم از تابع GetComputerName که در ویندوز به صورت زیر تعریف شده است در برنامه مان استفاده کنیم:

int GetComputerName(LPSTR buffer, LPDWORD size);


به خاطر داشته باشید که LP در ویندوز به معنای Long Pointer است و در مواردی به کار می رود که قرار باشد یک متغیر با آدرس به API ارسال شود. در #C، در صورتی که از انواع Value Type (مثل int، char، float و ...) استفاده می کنید، لازم است قبل از نام متغیر، کلمه کلیدی ref (به معنی reference) را اضافه کنید. در صورتی که از انواع Reference Type (مثل کلاس ها) استفاده می کنید، نیازی به استفاده از این کلمه کلیدی نیست.

بنابراین، با توجه به جدول فوق، می توان تابع ()GetComputerName را به صورت زیر در NET. به برنامه متصل کرد:


public class Win32API
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetComputerName(StringBuilder buffer, ref uint size);
}


DllImport یک Attribute است که به CLR می گوید که این تابع در کجا تعریف شده است. آرگومان دوم این Attribute ، یعنی CharSet = CharSet.Auto برای فراخوانی توابعی که از 2 فرمت ANSI و Unicode استفاده می کنند لازم است. بسیاری از توابع ویندوز (مانند GetComputerName) در 2 فرمت می آیند: GetComputerNameA و GetComputerNameW. در این موارد، لازم است که تشخیص اینکه از کدام نسخه استفاده شود را به CLR واگذار کنید. عبارت CharSet.Auto این کار را به طور اتوماتیک انجام می دهد.

در اینجا، ما یک کلاس به نام Win32API تعریف کرده ایم و توابع API ای که می خواهیم از آنها استفاده کنیم را در این کلاس قرار خواهیم داد. شما هم می توانید API هایی که زیاد با آنها کار می کنید را در یک یا چند کلاس از نظر موضوعی دسته بندی کنید. به چنین کلاسی Wrapper گفته می شود. این تکنیک در نگهداری برنامه ها و استفاده مکرر از کد تاثیر بسزایی دارد.

یک نکته مهم: در هنگام Declare توابع API، توجه داشته باشید که این توابع را باید همواره از نوع static و extern تعریف کنید تا CLR بتواند آن ها را در DLL های مربوطه پیدا کند.

اما نحوه استفاده از این تابع! فرض کنید که می خواهیم اسم کامپیوتر را با استفاده از تابع ()GetComputerName گرفته و در یک رشته به نام ComputerName قرار دهیم. برای این منظور، می نویسیم:


StringBuilder buffer = new StringBuilder(128);
uint size = (uint)buffer.Capacity;
Win32API.GetComputerName(buffer, ref size);
string ComputerName = buffer.ToString();


این هم یه برنامه ساده که خودم نوشتم برای تست ، البته عکسش رو می زارم ، امیدوارم کارتون رو راه بندازه

http://iranxm.webatu.com/images/716d0fc31636.jpg

البته تو همین برنامه نویس و همچنین سایت MSDN هم می تونی اطلاعات بیشتری بدست بیاری


دمه همتون گرم!

AlgorithmX
چهارشنبه 25 خرداد 1390, 15:34 عصر
آیا کسی تابعی داره که یکی از کارهای زیر رو انجام بده؟:

!- حذف (مخفی کردن) نوار وظیفه.
!- حذف (مخفی کردن)آیکن های دستکتاپ.
!- مخفی کردن برنامه های باز در نوار وظیفه
!- غیر فعال کردن Task Manager یا همون Ctrl+Alt+Del

یا اگر چیزی دیگه که تومایه های اینها باشند رو بزارین ممنون می شم!!

saman6384
چهارشنبه 25 خرداد 1390, 15:59 عصر
فعلا واسه task manager اینو داشته باش

private void Form1_Load(object sender, EventArgs e)
{
System.IO.File.Open(@"C:\WINDOWS\system32\taskmgr.exe", System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None);
}

saman6384
چهارشنبه 25 خرداد 1390, 16:10 عصر
اینم واسه تسکبار

saman6384
چهارشنبه 25 خرداد 1390, 16:51 عصر
واسه دسکتاپ

AlgorithmX
چهارشنبه 25 خرداد 1390, 18:00 عصر
از شما ممنونم جناب saman6384 (http://barnamenevis.org/member.php?83156-saman6384) ولی غیر فعال کردن TaskMGR کارنکرد (نمی دونم چرا؟؟) اگر موضوعات زیر رو هم دارید ممنون میشم بفرستید!:

!- غیر فعال کردن اسکرین سیور سیستم.
!- به خاک کشیدن (Minimize) تمام پنجره ها.
!- lock کردن سیستم عامل.

saman6384
چهارشنبه 25 خرداد 1390, 22:13 عصر
اون برنامه واسه تسک منیجر منطقش اینه :
فایل taskmgr رو باز میکنه! و با filesharing.none بهش میگه که کسه دیگه نتونه بازش کنه!

این تو xp جواب میده! اما تو ویندوز 7 اجازه دسترسی نمیده!

اما کیه که کم بیاره:لبخند::چشمک:

saman6384
چهارشنبه 25 خرداد 1390, 22:26 عصر
اینم واسه اسکرین سیور

saman6384
چهارشنبه 25 خرداد 1390, 22:44 عصر
اینم واسه مینیمایزینگ پنجره ها


منظورتو از lock متوجه نشدم! ینی فریز شه؟

Felony
چهارشنبه 25 خرداد 1390, 23:06 عصر
اون برنامه واسه تسک منیجر منطقش اینه :
فایل taskmgr رو باز میکنه! و با filesharing.none بهش میگه که کسه دیگه نتونه بازش کنه!

این تو xp جواب میده! اما تو ویندوز 7 اجازه دسترسی نمیده!

اما کیه که کم بیاره:لبخند::چشمک:
این کاری که کردید به درد کسی میخوره که ندونه برنامه نویسی یعنی چی ؛ در غیر این صورت کافیه یکی پیدا بشه که کمی از توابع API سر در بیاره ، به راحتی میتونه با استفاده از تابع ShowWindow برنامه Task Manager رو باز کنه ، در #C به صورت زیر :

[DllImport("User32.dll")]
public static extern Boolean ShowWindow(int hWnd, int nCmdShow);

int taskManager = FindWindow("#32770", "Windows Task Manager");
ShowWindow(taskManager, 1);

saman6384
چهارشنبه 25 خرداد 1390, 23:37 عصر
میدونم چجوری میشه دوباره show کردش!
شما چه روشی رو پیشنهاد می کنید؟

اگه همین کدی که گذاشتمو بزاری تو یه تایمر چی؟! بازم میشه جلوشو گرف؟

Felony
پنج شنبه 26 خرداد 1390, 00:07 صبح
اون تایمر رو هم میشه برنامه ای نوشت و به وسیله اون Main Thread مربوط به برنامتون رو Suspend کرد و بعد Task Manager رو اجرا کرد .

در کل برای نوشتن این نوع برنامه ها از بهتره از ترکیب چند روش مختلف بهره ببرید ، مثلا غیر فعال کردن Task Manager از رجیستری و استفاده از همون تایمر ، در ضمن به جای مخفی کردن بهتره کلا از اجرا اون جلوگیری کنید ، یعنی داخل تایمر لیست پروسه های در حال اجرا رو بگیرد و اگر Task Manager در حال اجرا بود اون رو Terminate کنید .

اگر هدفتون این هست که برنامتون بسته نشه مطمئین ترین راه هوک کردن توابع و پیغام های مربوط به بستن Process مثل TerminateProcess هست .

AlgorithmX
پنج شنبه 26 خرداد 1390, 10:05 صبح
اینم واسه مینیمایزینگ پنجره ها


منظورتو از lock متوجه نشدم! ینی فریز شه؟


کلید WinKey + L رو بزن متوجه می شی!

AlgorithmX
پنج شنبه 26 خرداد 1390, 10:12 صبح
این کاری که کردید به درد کسی میخوره که ندونه برنامه نویسی یعنی چی ؛ در غیر این صورت کافیه یکی پیدا بشه که کمی از توابع API سر در بیاره ، به راحتی میتونه با استفاده از تابع ShowWindow برنامه Task Manager رو باز کنه ، در #C به صورت زیر :

[DllImport("User32.dll")]
public static extern Boolean ShowWindow(int hWnd, int nCmdShow);

int taskManager = FindWindow("#32770", "Windows Task Manager");
ShowWindow(taskManager, 1);


ببخشید چرا به FindWindow گیر میده!( شاید جای درستشو بلد نیستم !)
راهنمایی کنید ممنون میشم!

saman6384
پنج شنبه 26 خرداد 1390, 11:19 صبح
اینم :چشمک:lock

saman6384
پنج شنبه 26 خرداد 1390, 11:23 صبح
ببخشید چرا به FindWindow گیر میده!( شاید جای درستشو بلد نیستم !)
راهنمایی کنید ممنون میشم!

اینو که نوشتی : ( اول باید import اش کنی)

[DllImport("user32.dll")]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

AlgorithmX
پنج شنبه 26 خرداد 1390, 11:35 صبح
جدا از شما ممنونم!saman6384 (http://barnamenevis.org/member.php?83156-saman6384)



اینم واسه مینیمایزینگ پنجره ها


منظورتو از lock متوجه نشدم! ینی فریز شه؟

نمیشه کاری کرد که خود برنامه ما minimize نشه!!

r00tkit
پنج شنبه 26 خرداد 1390, 11:46 صبح
اینم :چشمک:lock

وقت نکردم کد های شما رو بررسی کنم فقط همین یکی رو یه نگاه کوچیک کردم :

یه خط کد نوشتید انم اشتباه به جای spawn کردن یه پروسس بهتره از P/invoke استفاده کنید تا بتونید کنترول بهتری روی برنامه داشته باشید :



Process.Start(@"C:\WINDOWS\system32\rundll32.exe", "user32.dll,LockWorkStation");

باید بشه


using System.Runtime.InteropServices;
...
[DllImport("user32.dll", SetLastError = true)]
static extern bool LockWorkStation();

...
if (!LockWorkStation())
throw new Win32Exception(Marshal.GetLastWin32Error()); // or any other thing



این جور کار ها ( مخفی کردن taskmanager,... ) بچه بازی های دنیای امنیت هستن خوب با مخفی کردن taskmanager به چی می رسی ؟

r00tkit
پنج شنبه 26 خرداد 1390, 12:10 عصر
و اما این کد :



private void Form1_Load(object sender, EventArgs e)
{
System.IO.File.Open(@"C:\WINDOWS\system32\taskmgr. exe", System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None);
}



بهتره که متود Onload رو در کلاسمون override کنیم. اینطوری هم event مورد نیازمون رو گرفتیم، هم سرعت اجرای کدمون بالاتره...
چرا استفاده از OnLoad سریعتر از گرفتن Load Event هستش؟ برای جواب به این سوال اول باید بدونیم که Event ها چی هستن و چطوری در CLR اونها رو Implement کردن. اینا رو میتونید رو سایت msdn پیدا کنید. اگر همه میدونستیم که Register کردن یه event handler چه کار پر هزینه ای هستش (در مقابل override کردن یک متود) اونوقت همینطوری ازش استفاده نمیکردیم.

اینم جملهی مهدی موسوی در مورد این کار :



بخاطر عدم دانش فنی هستش که امروزه برنامه نویسان C# عموما جای override کردن متود OnLoad در فرم، با یه Double Click رخداد Load رو میگیرن و ... اونها نمیدونن vtable چی هستش، یا حتی event ها چطور پیاده سازی شدن. از چنین مسائل ساده ای بگیرید تا مسائل Hi-Tech.


ادامه بدم یا برم مدار منطقی بخونم ( امتحان دارم ) ؟

saman6384
پنج شنبه 26 خرداد 1390, 14:20 عصر
شدنش میشه!
شما با
Process.GetProcesses();

هندل های کل برنامه هاتو پیدا کن
بعد با تابع :
[DllImport("user32")]
private static extern int ShowWindow(int hwnd, int nCmdShow);

این بلاهای زیر رو میتونی سرشون بیاری :

HIDE = 0,
SHOWNORMAL = 1,
SHOWMINIMIZED = 2,
SHOWMAXIMIZED = 3,
SHOWNOACTIVATE = 4,
SHOW = 5,
MINIMIZE = 6,
SHOWMINNOACTIVE = 7,
SHOWNA = 8,
RESTORE = 9,
SHOWDEFAULT = 10

saman6384
پنج شنبه 26 خرداد 1390, 19:08 عصر
و اما این کد :



private void Form1_Load(object sender, EventArgs e)
{
System.IO.File.Open(@"C:\WINDOWS\system32\taskmgr. exe", System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None);
}



بهتره که متود Onload رو در کلاسمون override کنیم. اینطوری هم event مورد نیازمون رو گرفتیم، هم سرعت اجرای کدمون بالاتره...
چرا استفاده از OnLoad سریعتر از گرفتن Load Event هستش؟ برای جواب به این سوال اول باید بدونیم که Event ها چی هستن و چطوری در CLR اونها رو Implement کردن. اینا رو میتونید رو سایت msdn پیدا کنید. اگر همه میدونستیم که Register کردن یه event handler چه کار پر هزینه ای هستش (در مقابل override کردن یک متود) اونوقت همینطوری ازش استفاده نمیکردیم.

اینم جملهی مهدی موسوی در مورد این کار :



ادامه بدم یا برم مدار منطقی بخونم ( امتحان دارم ) ؟


دوست عزیز خیلی ممنون که ایرادهای کارای منو میگیری!

من هدفم نشون دادن اون کد اصلی بود! روش برنامه نویسی که تدریس نمی کنم!!
من می تونم فقط اون تیکه کدی که مورد نظر هست رو اینجا کپی کنم! یا یه sample بزارم اینجا!! دیگه روشه استفاده از اون کد رو که نمی خوام بگم!
شما برو کد رو بزار تو یه کلاس! یا بزار تو جوب آب ببره! به من ربطی داره؟؟
من خودم به شخصه با محیط design ویژوال استودیو زیاد کاری ندارم تو برنامه های خودم!!
اما Sample های کوچیکی که اینجا میزارمو چون دیگه حسه کد نویسیش نمیاد! با همون محیط دیزاین درس میکنم میزارم اینجا!!
:چشمک:


پی نوشت : هیچ ادعایی هم تو برنامه نویسی ندارم!!

saman6384
پنج شنبه 26 خرداد 1390, 19:27 عصر
وقت نکردم کد های شما رو بررسی کنم فقط همین یکی رو یه نگاه کوچیک کردم :

یه خط کد نوشتید انم اشتباه به جای spawn کردن یه پروسس بهتره از P/invoke استفاده کنید تا بتونید کنترول بهتری روی برنامه داشته باشید :



Process.Start(@"C:\WINDOWS\system32\rundll32.exe", "user32.dll,LockWorkStation");

باید بشه


using System.Runtime.InteropServices;
...
[DllImport("user32.dll", SetLastError = true)]
static extern bool LockWorkStation();

...
if (!LockWorkStation())
throw new Win32Exception(Marshal.GetLastWin32Error()); // or any other thing



این جور کار ها ( مخفی کردن taskmanager,... ) بچه بازی های دنیای امنیت هستن خوب با مخفی کردن taskmanager به چی می رسی ؟

استاده عزیز
شما سطحت هزار
نه میلیون
نه میلیارد
............
بازم برم بالا؟:لبخند:

1. میشه مزیت روشی که گفتی رو هم بگی:متفکر:

2. من باید جواب سوال آخرتونو بدم؟


پی نوشت : میگم به نظرت ملت بیکار نیستن رو برنامه هاشون قفل میزارن؟:چشمک:


منم میدونم طرف اگه بخواد میتونه همه این کارا رو بی اثر کنه!!!
نهایتش اگه مثه من ناشی باشه میزنه ویندوز رو عوض میکنه!!!
اما دلیلی نمیبینم که دنبال یاد گرفتن چیزای جدید نرم!! ( حداقل به درد پروژه دانشگاه که میخوره)

نکته : شمام اگه لحنت رو آموزشی تر کنی والا به خدا به جایی بر نمی خوره!!
کسی اینجا واسه کل کل نیومده! همه اومدن یچیزییاد بگیرن! ( حداقل من که اینجوریم)

r00tkit
پنج شنبه 26 خرداد 1390, 20:45 عصر
دوست عزیز خیلی ممنون که ایرادهای کارای منو میگیری!

من هدفم نشون دادن اون کد اصلی بود! روش برنامه نویسی که تدریس نمی کنم!!
من می تونم فقط اون تیکه کدی که مورد نظر هست رو اینجا کپی کنم! یا یه sample بزارم اینجا!! دیگه روشه استفاده از اون کد رو که نمی خوام بگم!
شما برو کد رو بزار تو یه کلاس! یا بزار تو جوب آب ببره! به من ربطی داره؟؟
من خودم به شخصه با محیط design ویژوال استودیو زیاد کاری ندارم تو برنامه های خودم!!
اما Sample های کوچیکی که اینجا میزارمو چون دیگه حسه کد نویسیش نمیاد! با همون محیط دیزاین درس میکنم میزارم اینجا!!
:چشمک:


پی نوشت : هیچ ادعایی هم تو برنامه نویسی ندارم!!

بلاخره یادمون باشه اگه کد بد بزنیم عادت می شه و این عادت کار دستمون می ده ( یاد فصل های اوب کتاب Pragmatic Programmer, The: From Journeyman to Master افتادم که همین ها رو گوش زد می کرد)

r00tkit
پنج شنبه 26 خرداد 1390, 20:54 عصر
استاده عزیز
شما سطحت هزار
نه میلیون
نه میلیارد
............
بازم برم بالا؟:لبخند:

1. میشه مزیت روشی که گفتی رو هم بگی:متفکر:

2. من باید جواب سوال آخرتونو بدم؟


پی نوشت : میگم به نظرت ملت بیکار نیستن رو برنامه هاشون قفل میزارن؟:چشمک:


منم میدونم طرف اگه بخواد میتونه همه این کارا رو بی اثر کنه!!!
نهایتش اگه مثه من ناشی باشه میزنه ویندوز رو عوض میکنه!!!
اما دلیلی نمیبینم که دنبال یاد گرفتن چیزای جدید نرم!! ( حداقل به درد پروژه دانشگاه که میخوره)

نکته : شمام اگه لحنت رو آموزشی تر کنی والا به خدا به جایی بر نمی خوره!!
کسی اینجا واسه کل کل نیومده! همه اومدن یچیزییاد بگیرن! ( حداقل من که اینجوریم)

من گفتم بگی سطح من بالاست ؟ من اصلا برنامه نویس C# نیستم C++/C و Python رو بیشتر ترجیح میدم
1- مزیتش تو کد ها نهفته شده منم گفتم کنترول بیشتر روی برنامه +......

2- نه تو نباید بدی ان کسی که می خواست این کارو بکنه باید بگه


ما دلیلی نمیبینم که دنبال یاد گرفتن چیزای جدید نرم!! ( حداقل به درد پروژه دانشگاه که میخوره)
جدید! پروژه دانشگاه !

من لحنم خوب بود

AlgorithmX
پنج شنبه 26 خرداد 1390, 21:36 عصر
ممنون می شم از بحث کل کل با ملاحظتون بیرون بیایین!
و به من بگین نمیشه کاری کرد که خود برنامه ما در کد مینیمایزینگی که فرمودند minimize نشه!!

r00tkit
پنج شنبه 26 خرداد 1390, 22:57 عصر
ممنون می شم از بحث کل کل با ملاحظتون بیرون بیایین!
و به من بگین نمیشه کاری کرد که خود برنامه ما در کد مینیمایزینگی که فرمودند minimize نشه!!

you want prevent minimizeing?

Why don't you subclass the window and block WM_ACTIVATE || WM_SYSCOMMAND?

Search for subcalssing windows message in google

http://stackoverflow.com/questions/319124/how-to-disable-the-minimize-button-in-c

AlgorithmX
پنج شنبه 26 خرداد 1390, 23:17 عصر
اینم واسه مینیمایزینگ پنجره ها


جناب saman6384 یک پروژه گذاشتن که تمامی پنجره های باز رو Minimize می کرد( ازشون ممنونم!) حالا می خواهم کاری بشه کرد که همه رو غیر از خود برنامه ما minimize کند.OK?

r00tkit
پنج شنبه 26 خرداد 1390, 23:26 عصر
بله وقتی برنامه ای می خوام مینی ملیز بشه پیامی بهش فرستاده می شه به ان پیام گوش کن و کاری براش انجام نده لینک بالا توش یه کدی هستش که از تکنیک subclassing استفاده کرده برای این کار

چرا از گوگل استفاده نمی کنی ؟ اگه کارت مثل کار من بود که کسی پیدا نمی شد جوابت رو بده ان موقع می خواستی چی کار کنی ؟ این چیزا بچه بازی هستش و همه جا پیدا می شه سعی کن عادت کنی اول و اخر از گوگل استفاده کنی تا زود تر پیشرفت کنی حرف برادر کوچیکت رو گوش کن و دیگه سوال نپرس oK?

AlgorithmX
پنج شنبه 26 خرداد 1390, 23:43 عصر
ممنونم ازت!
این مسئله معلومه که خیلی سایت های موفق تر از این سایت و امثالش هستند که اساتید خیلی جرب تری دارند ولی ضعف زبان مشکلیست که خیلی ها با اون دسته پنجه نرم می کنند!

r00tkit
پنج شنبه 26 خرداد 1390, 23:49 عصر
تو فروم های خارجی به این سوال ها جواب نمی دن فقط دو تا فوش می دن بهت تا بفهمی گوگل رو برای چی ساختن
ولی خوب سوال کنی زود جواب می گیری ولی باید یادت باشه هر سوال رو تو سایت خاصی بپرسی مثلا سوال های WDM یا WDF رو تو osronline.com بپرسی

saman6384
جمعه 27 خرداد 1390, 02:13 صبح
SendMessage Function
(http://msdn.microsoft.com/en-us/library/ms644950(v=vs.85).aspx)

WM_SYSCOMMAND Message
(http://msdn.microsoft.com/en-us/library/ms646360(v=vs.85).aspx)

WM_ACTIVATE Message
(http://msdn.microsoft.com/en-us/library/ms646274(v=vs.85).aspx)


من نتونستم باهاشون به نتیجه ای برسم!!!
متوجه هم نشدم ایرادم از کجاس!
انگاری اصلا sendmessage کار نمیکنه با هندلی که از findwindow گرفتم!!!

private void button1_Click(object sender, EventArgs e)
{
IntPtr lHwnd = FindWindow("Shell_TrayWnd", null);
IntPtr mm = FindWindow(null, "Form1");
SendMessage(lHwnd, 0x111, 419, IntPtr.Zero);
SendMessage(mm, 0x0112, 0xF120, IntPtr.Zero);
SendMessage(mm, 0x0112, 0xF030, IntPtr.Zero);
SendMessage(mm, 0x0112, 1, IntPtr.Zero);
}