c#怎么获得桌面图标的位置,并让坐标动起来

zhangzhaoyang 2007-08-03 05:53:33
我做了个小精灵和QQ宠物是的,我想让它在桌面走的过程中碰到打开的窗口可以顺着窗口怕上去,如果碰到桌面上的图标就一脚踢开,图标飞到其他地方去,大虾们这应该用到哪个WIN API 啊,?我找了好几天不知道怎么弄,请指教,最好有源码,在线等,解决立即给分!
...全文
1022 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangzhaoyang 2007-08-06
  • 打赏
  • 举报
回复
所有的分都给你吧!!!100分
zhangzhaoyang 2007-08-06
  • 打赏
  • 举报
回复
哥们你太牛了,我找了好几天了都没找着C#的,谢谢了,我这就结帖去,给分!
gimse7en 2007-08-05
  • 打赏
  • 举报
回复
老实说,真的没看懂,大师,有C#的吗
王集鹄 2007-08-05
  • 打赏
  • 举报
回复
今天心情好,给你做一下翻译
关于改变图标位置,通过消息“LVM_SETITEMW = LVM_FIRST + 76;”实现

from
http://blog.sina.com.cn/u/589d32f501000at2

using System.Runtime.InteropServices;

public const uint LVM_FIRST = 0x1000;
public const uint LVM_GETITEMCOUNT = LVM_FIRST + 4;
public const uint LVM_GETITEMW = LVM_FIRST + 75;
public const uint LVM_GETITEMPOSITION = LVM_FIRST + 16;

[DllImport("user32.DLL")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindow(string lpszClass, string lpszWindow);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,
IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd,
out uint dwProcessId);

public const uint PROCESS_VM_OPERATION = 0x0008;
public const uint PROCESS_VM_READ = 0x0010;
public const uint PROCESS_VM_WRITE = 0x0020;

[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(uint dwDesiredAccess,
bool bInheritHandle, uint dwProcessId);
public const uint MEM_COMMIT = 0x1000;
public const uint MEM_RELEASE = 0x8000;

public const uint MEM_RESERVE = 0x2000;
public const uint PAGE_READWRITE = 4;

[DllImport("kernel32.dll")]
public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress,
uint dwSize, uint flAllocationType, uint flProtect);

[DllImport("kernel32.dll")]
public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress,
uint dwSize, uint dwFreeType);

[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr handle);

[DllImport("kernel32.dll")]
public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);

[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);

public struct LVITEM
{
public int mask;
public int iItem;
public int iSubItem;
public int state;
public int stateMask;
public IntPtr pszText; // string
public int cchTextMax;
public int iImage;
public IntPtr lParam;
public int iIndent;
public int iGroupId;
public int cColumns;
public IntPtr puColumns;
}
public int LVIF_TEXT = 0x0001;

public int ListView_GetItemCount(IntPtr AHandle)
{
return SendMessage(AHandle, LVM_GETITEMCOUNT, 0, 0);
}

public bool ListView_GetItemPosition(IntPtr AHandle, int AIndex, IntPtr APoint)
{
return SendMessage(AHandle, LVM_GETITEMPOSITION, AIndex, APoint.ToInt32()) != 0;
}

private void button1_Click(object sender, EventArgs e)
{
IntPtr vHandle = FindWindow("Progman", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SysListView32", null);
int vItemCount = ListView_GetItemCount(vHandle);
uint vProcessId;
GetWindowThreadProcessId(vHandle, out vProcessId);

IntPtr vProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
PROCESS_VM_WRITE, false, vProcessId);
IntPtr vPointer = VirtualAllocEx(vProcess, IntPtr.Zero, 4096,
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
try
{
for (int i = 0; i < vItemCount; i++)
{
byte[] vBuffer = new byte[256];
LVITEM[] vItem = new LVITEM[1];
vItem[0].mask = LVIF_TEXT;
vItem[0].iItem = i;
vItem[0].iSubItem = 0;
vItem[0].cchTextMax = vBuffer.Length;
vItem[0].pszText = (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM)));
uint vNumberOfBytesRead = 0;

WriteProcessMemory(vProcess, vPointer,
Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0),
Marshal.SizeOf(typeof(LVITEM)), ref vNumberOfBytesRead);
SendMessage(vHandle, LVM_GETITEMW, i, vPointer.ToInt32());
ReadProcessMemory(vProcess,
(IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM))),
Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0),
vBuffer.Length, ref vNumberOfBytesRead);
string vText = Encoding.Unicode.GetString(vBuffer, 0,
(int)vNumberOfBytesRead);
if (vText.Substring(0, 4) == "我的电脑")
{
ListView_GetItemPosition(vHandle, i, vPointer);
Point[] vPoint = new Point[1];

ReadProcessMemory(vProcess, vPointer,
Marshal.UnsafeAddrOfPinnedArrayElement(vPoint, 0),
Marshal.SizeOf(typeof(Point)), ref vNumberOfBytesRead);
Text = vPoint[0].ToString();
break;
}
}
}
finally
{
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
CloseHandle(vProcess);
}
}

zhangzhaoyang 2007-08-05
  • 打赏
  • 举报
回复
自己顶一下
zhangzhaoyang 2007-08-04
  • 打赏
  • 举报
回复
大哥,桌面图标不只是固定的几个啊,还有自己定义的一些图标,都要获得.WIN API我以前没弄过,最近刚开始看,看不大懂啊,能不能给点能在C#里用的,详细点的啊,或者联系我QQ吧,124344664
zhangzhaoyang 2007-08-04
  • 打赏
  • 举报
回复
就是要获得桌面图标的位置,然后用程序去设置它的位置
daizhenbest 2007-08-04
  • 打赏
  • 举报
回复
的确有意思, 我好久没见我的qq宠物了 55555555
熊出没危险 2007-08-04
  • 打赏
  • 举报
回复
帮顶....关注....
Darcy杨 2007-08-04
  • 打赏
  • 举报
回复
http://www.pcvc.net/category/content.asp?sendid=122
这个?
zhangzhaoyang 2007-08-04
  • 打赏
  • 举报
回复
ListView_GetItemCount这是一个什么方法啊??
api 没有啊??
能不能把常量列出值来啊,C#不识别这种常量啊~~~~
只要能解决问题我会多加分的~~~
fengjun19912 2007-08-04
  • 打赏
  • 举报
回复
学习下
zhangzhaoyang 2007-08-04
  • 打赏
  • 举报
回复
亲哥哎,俺看不懂DELPHI,啊.WIN API也刚刚看,不会改啊,能不能给个C#的啊,我用的是C#
zhangzhaoyang 2007-08-04
  • 打赏
  • 举报
回复
大哥,别光自己做啊,会做也教教我啊,我都快急死了,好几天都没睡觉了,急用
shinaterry 2007-08-04
  • 打赏
  • 举报
回复
哈哈.有意思...

有时间我也做一个...
王集鹄 2007-08-04
  • 打赏
  • 举报
回复
参考如下代码:

from
http://blog.sina.com.cn/u/589d32f5010007y8

得到桌面某个图标放置的坐标

uses CommCtrl;
procedure TForm1.Button1Click(Sender: TObject);
var
vHandle: THandle;
var
vItemCount: Integer;
I: Integer;
vBuffer: array[0..255] of Char;
vProcessId: DWORD;
vProcess: THandle;
vPointer: Pointer;
vNumberOfBytesRead: Cardinal;
vItem: TLVItem;
vPoint: TPoint;
begin
vHandle := FindWindow('progman', nil);
vHandle := FindWindowEx(vHandle, 0, 'shelldll_defview', nil);
vHandle := FindWindowEx(vHandle, 0, 'syslistview32', nil);
vItemCount := ListView_GetItemCount(vHandle);
GetWindowThreadProcessId(vHandle, @vProcessId);
vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
PROCESS_VM_WRITE, False, vProcessId);
vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
PAGE_READWRITE);
try
for I := 0 to vItemCount - 1 do
begin
with vItem do
begin
mask := LVIF_TEXT;
iItem := I;
iSubItem := 0;
cchTextMax := SizeOf(vBuffer);
pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
end;
WriteProcessMemory(vProcess, vPointer, @vItem,
SizeOf(TLVItem), vNumberOfBytesRead);
SendMessage(vHandle, LVM_GETITEM, I, lparam(vPointer));
ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
@vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
if SameText('我的电脑', vBuffer) then
begin
ListView_GetItemPosition(vHandle, I, PPoint(vPointer)^);
ReadProcessMemory(vProcess, vPointer, @vPoint, SizeOf(TPoint),
vNumberOfBytesRead);
Caption := Format('%d,%d', [vPoint.X, vPoint.Y]);
Break;
end;
end;
finally
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
CloseHandle(vProcess);
end;
end;
shen521941 2007-08-04
  • 打赏
  • 举报
回复
关注
破碎的脸 2007-08-03
  • 打赏
  • 举报
回复
如果说要得到桌面上的图标位置这个估计很是麻烦,但是设置自身的坐标这个就比较简单了。
zhangzhaoyang 2007-08-03
  • 打赏
  • 举报
回复
就是怎么获得桌面上图标的坐标和设置它的坐标
kkun_3yue3 2007-08-03
  • 打赏
  • 举报
回复
哇,这个。。。。。比较难!建议你还是把问题具体后再来提问吧,

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧