fvgrod Цитата: Подскажи, а как вызвать WinAPI функцию на С#? Ни разу с ними не работал еще.
Под тегом more пример - как поменять обои на рабочем столе. Не скажу, что мой, но мной модифицированный
. Суть в том что директивами вида [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] ты должен объявить нужные функции и потом разумно ими пользоваться.
[more]
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.IO;
using System.Diagnostics;
using System.Data;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.Collections.Specialized;
using System.Xml;
using Microsoft.Win32;
using System.Media;
namespace DesktopTools {
public static class WallpaperHelpers {
public enum WallpaperPos {
Centre = 0,
Tiled,
Streched
};
const int SPI_SETDESKWALLPAPER = 20;
const int SPIF_UPDATEINIFILE = 0x01;
const int SPIF_SENDWININICHANGE = 0x02;
const int COLOR_BACKGROUND = 1;
const int SPI_GETSCREENSAVEACTIVE = 16;
const int SPI_SETSCREENSAVEACTIVE = 17;
const int GW_CHILD = 5;
const int SW_HIDE = 0;
const int SW_SHOW = 5;
const int MOD_ALT = 0x0001;
const int MOD_CONTROL = 0x0002;
const int MOD_SHIFT = 0x0004;
const int MOD_WIN = 0x0008;
const int WM_HOTKEY = 0x0312;
private static Bitmap bitmap;
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int SystemParametersInfo(
int uAction, int uParam, string lpvParam, int fuWinIni);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int SystemParametersInfo(
int uAction, int uParam, ref int lpvParam, int fuWinIni);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int SystemParametersInfo(
int uAction, int uParam, int lpvParam, int fuWinIni);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool SetSysColors(int cElements, int[] lpaElements, int[] lpaRgbValues);
public static void LoadBitmapFromFile(string filename) {
bitmap = new Bitmap(filename);
}
public static void SaveBitmapToFile(string filename) {
bitmap.Save(filename);
}
public static void SetWallpaper(Bitmap bitmap) {
string wallpaperPath = System.Environment.CurrentDirectory + "\\current_wallpaper.bmp";
bitmap.Save(wallpaperPath, ImageFormat.Bmp);
SetWallpaper(wallpaperPath, WallpaperPos.Streched, Color.Transparent);
}
public static void SetWallpaper(string filePath, WallpaperPos pos, Color BkColour) {
RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true);
string strWallpaperPath = System.Environment.CurrentDirectory + "\\current_wallpaper.bmp";
FileInfo fileInfo = new FileInfo(filePath);
if (fileInfo.Extension != ".bmp") {
Image image;
image = Image.FromFile(filePath);
image.Save(strWallpaperPath, ImageFormat.Bmp);
}
else if (!filePath.Equals(strWallpaperPath, StringComparison.CurrentCultureIgnoreCase)) {
fileInfo.CopyTo(strWallpaperPath, true);
}
switch (pos) {
case WallpaperPos.Streched:
key.SetValue(@"WallpaperStyle", "2");
key.SetValue(@"TileWallpaper", "0");
break;
case WallpaperPos.Centre:
key.SetValue(@"WallpaperStyle", "1");
key.SetValue(@"TileWallpaper", "0");
break;
case WallpaperPos.Tiled:
key.SetValue(@"WallpaperStyle", "1");
key.SetValue(@"TileWallpaper", "1");
break;
}
key.Close();
int[] nElements = { COLOR_BACKGROUND };
int[] nColors = { System.Drawing.ColorTranslator.ToWin32(BkColour) };
SetSysColors(nElements.Length, nElements, nColors);
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, strWallpaperPath, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
//GC.Collect();
}
}
}
[/more]
Добавлено: CruelCrow А в Response не нужно разве задавать Content-Type? То есть ты пытаешься отдать бразеру изображение, а не предупредил его об этом. Попробуй в эту сторону порыть.