日期:2014-05-18  浏览次数:21151 次

高分求助桌面图标自动排列
C#         怎么调用api使桌面图标自动排列,然后撤销自动排列。。。
请高手指点~~~~

------解决方案--------------------
#region 导入api
[DllImport( "user32.dll ", EntryPoint = "FindWindow ")]
public static extern int FindWindow(
string lpClassName,
int lpWindowName
);

[DllImport( "user32.dll ", EntryPoint = "ShowWindow ")]
public static extern int ShowWindow(
int hwnd,
int nCmdShow
);

[DllImport( "user32.dll ", EntryPoint = "FindWindowEx ")]
public static extern int FindWindowEx(
int hWnd1,
int hWnd2,
string lpsz1,
int lpsz2
);

[DllImport( "user32.dll ")]
public static extern int SetWindowLong(
IntPtr hwnd,
int nIndex,
int dwNewLong
);
[DllImport( "user32.dll ")]
public static extern int GetWindowLong(IntPtr hWnd,
int nIndex);
#endregion

const int GWL_STYLE = -16;
const int LVS_AUTOARRANGE = 0x0100;
/// <summary>
/// 撤销自动排列
/// </summary>
public void DisableAutoArrange()
{
int hwnd, child;
hwnd = FindWindow( "progman ", 0);
hwnd = FindWindowEx(hwnd, 0, "shelldll_defview ", 0);
child = FindWindowEx(hwnd, 0, "SysListView32 ", 0);
int oldValue = GetWindowLong((IntPtr)child, GWL_STYLE);
SetWindowLong((IntPtr)child, GWL_STYLE, oldValue & ~LVS_AUTOARRANGE);
}


[DllImport( "user32.dll ", CharSet = CharSet.Unicode)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

const int LVM_First = 0x1000;
const int LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_First + 54;
const int LVS_EX_SNAPTOGRID = 0x00080000;

/// <summary>
/// 取消对齐到网格
/// </summary>
public void DisableAlignToGrid()
{
int hwnd, child;
hwnd = FindWindow( "progman ", 0);
hwnd = FindWindowEx(hwnd, 0, "shelldll_defview ", 0);
child = FindWindowEx(hwnd, 0, "SysListView32 ", 0);
SendMessage(new IntPtr(child), LVM_SETEXTENDEDLISTVIEWSTYLE, new IntPtr(LVS_EX_SNAPTOGRID), IntPtr.Zero);
}