تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تحديث سطح المكتب
#1
كاتب الموضوع : 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
تترك للتجربة

يتبع
}}}
تم الشكر بواسطة:
#2
هناك دالة نستطيع الاستفادة منها في هذه الحالة من أجل ارسال أمر التحديث لسطح المكتب
وهي 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]

بالتوفيق للجميع
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  طريقه سهله وسريعه لاخذ صوره لسطح المكتب وحفظها علي الهارد ديسك RaggiTech 0 2,043 17-10-12, 08:44 PM
آخر رد: RaggiTech
  اظهار اسم النظام + اصداره على سطح المكتب RaggiTech 0 2,353 17-10-12, 08:42 PM
آخر رد: RaggiTech
  لعمل اختصار على سطح المكتب RaggiTech 0 2,058 17-10-12, 06:10 PM
آخر رد: RaggiTech
  لانشاء مجلد على سطح المكتب RaggiTech 0 1,889 17-10-12, 06:02 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم