تحديث سطح المكتب - RaggiTech - 17-10-12
كاتب الموضوع : DreamNet
السلام عليكم ورحمة الله وبركاته
لا تتعجل قبل أن أفكر في تنفيذ العملية كنت أتصورها سهلة لكن عندما احتجت إلى تطبيقها وجدت الأمر ليس سهلا
لكن لماذا أحتاج إلى تحديث سطح المكتب؟
الفكرة كانت في الأول إلى حذف الصورة التي على سطح المكتب باستعمال الدالة SystemParametersInfo وجعل صورة سطح المكتب فارغة
كود :
[color=#000000][COLOR=#0000bb][/color][color=#007700][[/color][color=#0000bb]DllImport[/color][color=#007700]([/color][color=#dd0000]"user32.dll"[/color][color=#007700], [/color][color=#0000bb]CharSet [/color][color=#007700]= [/color][color=#0000bb]CharSet[/color][color=#007700].[/color][color=#0000bb]Auto[/color][COLOR=#007700])]
public static [/COLOR][color=#0000bb]extern int SystemParametersInfo[/color][color=#007700]([/color][color=#0000bb]int uAction[/color][COLOR=#007700],
[/COLOR][color=#0000bb]int uParam[/color][COLOR=#007700],
[/COLOR][color=#0000bb]string lpvParam[/color][COLOR=#007700],
[/COLOR][color=#0000bb]int fuWinIni[/color][COLOR=#007700]);
[/COLOR][color=#0000bb][/color][/COLOR]
الكود التالي يقوم باالمهمة المطلوبة وهي جعل صورة سطح المكتب فارغة :
كود :
[color=#000000][COLOR=#0000bb]SystemParametersInfo[/color][color=#007700]([/color][color=#0000bb]0X14[/color][color=#007700], [/color][color=#0000bb]0[/color][color=#007700], [/color][color=#dd0000]"(None)"[/color][color=#007700], [/color][color=#0000bb]0x1 [/color][COLOR=#007700]);
[/COLOR][color=#0000bb][/color][/COLOR]
لكن مع ذلك فانه لن يظهر لك اختفاء سطح المكتب إلا في حالة عمل تحديث Refresh لسطح المكتب
قد يقول البعض هذا سهل فقط نقوم بالضغط على F5 باستعمال SendKeys
تترك للتجربة
يتبع
تحديث سطح المكتب - RaggiTech - 17-10-12
هناك دالة نستطيع الاستفادة منها في هذه الحالة من أجل ارسال أمر التحديث لسطح المكتب
وهي SendMessageTimeout باستعمال التابع WM_SETTINGCHANGE
كود :
[color=#000000][COLOR=#007700][[/color][color=#0000bb]DllImport[/color][color=#007700]([/color][color=#dd0000]"user32.dll"[/color][color=#007700], [/color][color=#0000bb]SetLastError [/color][color=#007700]= [/color][color=#0000bb]true[/color][color=#007700], [/color][color=#0000bb]CharSet [/color][color=#007700]= [/color][color=#0000bb]CharSet[/color][color=#007700].[/color][color=#0000bb]Auto[/color][COLOR=#007700])]
static [/COLOR][color=#0000bb]extern IntPtr SendMessageTimeout[/color][COLOR=#007700](
[/COLOR][color=#0000bb]IntPtr hWnd[/color][COLOR=#007700],
[/COLOR][color=#0000bb]uint Msg[/color][COLOR=#007700],
[/COLOR][color=#0000bb]UIntPtr wParam[/color][COLOR=#007700],
[/COLOR][color=#0000bb]IntPtr lParam[/color][COLOR=#007700],
[/COLOR][color=#0000bb]uint fuFlags[/color][COLOR=#007700],
[/COLOR][color=#0000bb]uint uTimeout[/color][COLOR=#007700],
[/COLOR][color=#0000bb]out uint lpdwResult[/color][COLOR=#007700]);
[/COLOR][/COLOR]
لكن هنا يجب الأخذ بعين الاعتبار أن التحديث لا يتم إلا اذا كان هناك تغيير في الاعدادات على سطح المكتب وأسهل شئ يمكننا تغييره في الاعدادات هو حجم الأيقونات (عادة مايكون 32 )
عن طريق الريجيستري يمكنن تغيير هذه القيمة ثم ارسال الأمر كي يتم فعلا التحديث
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]private [/color][color=#0000bb]void RefreshDesptop[/color][COLOR=#007700]()
{
[/COLOR][color=#0000bb]string icon_size_string[/color][COLOR=#007700];
[/COLOR][color=#0000bb]string new_icon_size_string [/color][COLOR=#007700];
[/COLOR][COLOR=#ff8000]//قراءة أبعاد الأيقونات من الريجيستري
[/COLOR][color=#0000bb]icon_size_string [/color][color=#007700]= [/color][color=#0000bb]Microsoft[/color][color=#007700].[/color][color=#0000bb]Win32[/color][color=#007700].[/color][color=#0000bb]Registry[/color][color=#007700].[/color][color=#0000bb]CurrentUser[/color][color=#007700].[/color][COLOR=#0000bb]OpenSubKey
[/COLOR][color=#007700](@[/color][color=#dd0000]"Control Panel\Desktop\WindowMetrics"[/color][color=#007700]).[/color][color=#0000bb]GetValue[/color][color=#007700]([/color][color=#dd0000]"Shell Icon Size"[/color][color=#007700]).[/color][color=#0000bb]ToString[/color][COLOR=#007700]();
[/COLOR][COLOR=#ff8000]//كتابة أبعاد جديدة للأيقونات باضفة 1 في الريجيستري
[/COLOR][color=#0000bb]new_icon_size_string [/color][color=#007700]= ([/color][color=#0000bb]int[/color][color=#007700].[/color][color=#0000bb]Parse[/color][color=#007700]([/color][color=#0000bb]icon_size_string [/color][color=#007700])+[/color][color=#0000bb]1[/color][color=#007700]).[/color][color=#0000bb]ToString[/color][COLOR=#007700]();
[/COLOR][color=#0000bb]Microsoft[/color][color=#007700].[/color][color=#0000bb]Win32[/color][color=#007700].[/color][color=#0000bb]Registry[/color][color=#007700].[/color][color=#0000bb]CurrentUser[/color][color=#007700].[/color][color=#0000bb]OpenSubKey[/color][color=#007700](@[/color][COLOR=#dd0000]"Control Panel\Desktop\WindowMetrics"
[/COLOR][color=#007700],[/color][color=#0000bb]true[/color][color=#007700]).[/color][color=#0000bb]SetValue[/color][color=#007700]( [/color][color=#dd0000]"Shell Icon Size"[/color][color=#007700],[/color][color=#0000bb]new_icon_size_string[/color][COLOR=#007700]);
[/COLOR][COLOR=#ff8000]// ارسال أمر التحديث
[/COLOR][color=#0000bb]SendMessageTimeout[/color][color=#007700](([/color][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]IntPtr[/color][color=#007700])[/color][color=#0000bb]HWND_BROADCAST[/color][COLOR=#007700],
[/COLOR][color=#0000bb]WM_SETTINGCHANGE[/color][COLOR=#007700],
([/COLOR][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]UIntPtr[/color][color=#007700])[/color][color=#0000bb]SPI_SETNONCLIENTMETRICS[/color][COLOR=#007700],
[/COLOR][color=#0000bb]IntPtr[/color][color=#007700].[/color][color=#0000bb]Zero[/color][COLOR=#007700],
[/COLOR][color=#0000bb]SMTO_ABORTIFHUNG[/color][COLOR=#007700],
[/COLOR][color=#0000bb]1000[/color][color=#007700], [/color][color=#0000bb]out lRes[/color][COLOR=#007700]);
[/COLOR][COLOR=#ff8000]// ارجاع القيمة الافتراضية المعدلة من الريجيستري
[/COLOR][color=#0000bb]Microsoft[/color][color=#007700].[/color][color=#0000bb]Win32[/color][color=#007700].[/color][color=#0000bb]Registry[/color][color=#007700].[/color][color=#0000bb]CurrentUser[/color][color=#007700].[/color][color=#0000bb]OpenSubKey[/color][color=#007700](@[/color][COLOR=#dd0000]"Control Panel\Desktop\WindowMetrics"
[/COLOR][color=#007700], [/color][color=#0000bb]true[/color][color=#007700]).[/color][color=#0000bb]SetValue[/color][color=#007700]([/color][color=#dd0000]"Shell Icon Size"[/color][color=#007700], [/color][color=#0000bb]icon_size_string[/color][COLOR=#007700]);
[/COLOR][COLOR=#ff8000]//ارسال أمر التحديث مجددا
[/COLOR][color=#0000bb]SendMessageTimeout[/color][color=#007700](([/color][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]IntPtr[/color][color=#007700])[/color][color=#0000bb]HWND_BROADCAST[/color][COLOR=#007700],
[/COLOR][color=#0000bb]WM_SETTINGCHANGE[/color][COLOR=#007700],
([/COLOR][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]UIntPtr[/color][color=#007700])[/color][color=#0000bb]SPI_SETNONCLIENTMETRICS[/color][COLOR=#007700],
[/COLOR][color=#0000bb]IntPtr[/color][color=#007700].[/color][color=#0000bb]Zero[/color][COLOR=#007700],
[/COLOR][color=#0000bb]SMTO_ABORTIFHUNG[/color][COLOR=#007700],
[/COLOR][color=#0000bb]1000[/color][color=#007700], [/color][color=#0000bb]out lRes[/color][COLOR=#007700]);
}
[/COLOR][/COLOR]
في الأخير يمكن ارجاع صورة سطح المكتب (بعد انهاء البرنامج اذا أردت ) بقراءتها من الريجيستري واستعمال نفس الدالة SystemParametersInfo التي استعملناها لحذف الخلفية باستبدال None بالمكان المستخرج من الريجيستري
كود :
[color=#000000][COLOR=#007700]private [/color][color=#0000bb]void RestoreWallpaper[/color][COLOR=#007700]()
{
[/COLOR][COLOR=#ff8000]//قراءة مكان الصورة الحالية لسطح المكتب
[/COLOR][color=#0000bb]string WallpaerImage[/color][COLOR=#007700];
[/COLOR][color=#0000bb]WallpaerImage [/color][color=#007700]= [/color][color=#0000bb]Microsoft[/color][color=#007700].[/color][color=#0000bb]Win32[/color][color=#007700].[/color][color=#0000bb]Registry[/color][color=#007700].[/color][color=#0000bb]CurrentUser[/color][color=#007700].[/color][COLOR=#0000bb]OpenSubKey
[/COLOR][color=#007700](@[/color][color=#dd0000]"Control Panel\Desktop"[/color][color=#007700]).[/color][color=#0000bb]GetValue[/color][color=#007700]([/color][color=#dd0000]"Wallpaper"[/color][color=#007700]).[/color][color=#0000bb]ToString[/color][COLOR=#007700]();
[/COLOR][COLOR=#ff8000]//استرجاع صورة سطح المكتب
[/COLOR][color=#0000bb]SystemParametersInfo[/color][color=#007700]([/color][color=#0000bb]0X14[/color][color=#007700], [/color][color=#0000bb]0[/color][color=#007700], [/color][color=#0000bb]WallpaerImage[/color][color=#007700], [/color][color=#0000bb]0x1[/color][COLOR=#007700]);
}
[/COLOR][/COLOR]
بالتوفيق للجميع
|