vb获取计算机桌面路径,VB取得桌面图标的座标

说明

在如何任意排列桌面圖示由提到如何设定作面图示的位置,但如果想知道这些图示的位置该如何做呢,简单说,其实桌面就是一个ListView

Control,我们就可以直接用ListView Control Message来对他下命令

这些参数都是LVM_开头的参数首先必须取得ListView的Handle 方法如下

hdesk = FindWindowEx(hdesk, 0,"progman",

vbNullString)

hdesk = FindWindowEx(hdesk, 0, "shelldll_defview",

vbNullString)

hdesk = FindWindowEx(hdesk, 0, "syslistview32",

vbNullString)

找到後 就可以用SendMessage传送LVM_GETITEMPOSITION给ListView

用来取得座标值

Dim o As POINTAPI

Call SendMessage(hdesk, LVM_GETITEMPOSITION, i, o)

但这会发生一个问题 GetItemPosition这并不能跨模组使用在别的程序呼叫会发生错误

因为SendMessage会传入o的位址而这个位只是指向呼叫的程序而不是ListView的程序

但ListView并不知道他还是会乖乖的把变数写到自己的程序里面(在Win32中

不同的Process间,同为&H405699位址是指向不同的地方) 如果这个位只是不能读写的 程式就当掉了

有没有方法能定出一个在每个程序中都是相同的位址呢 在95/98/ME中就是透过记忆体映射档 而NT中就得透过Debug

API 请参考一下程式关於更详细的记忆体配置请参考 如何再外部程式配置記憶體

程式

'这个程式需要一个Command,一个ListBox

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias

"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As

String) As Long

Private Declare Function FindWindowEx Lib "user32" Alias

"FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As

Long, ByVal lpClassName As String, ByVal lpWindowName As String) As

Long

Private Declare Function SendMessage Lib "user32" Alias

"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal

wParam As Long, lParam As Long) As Long

Private Const LVM_GETTITEMCOUNT& = (&H1000 + 4)

Private Const LVM_GETITEMPOSITION& = (&H1000 +

16)

Private Type POINTAPI

x As

Long

y As

Long

End Type

Private Declare Function OpenProcess Lib "kernel32" (ByVal

dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal

dwProcessId As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal

hObject As Long) As Long

Private Declare Function GetWindowThreadProcessIdLib "user32"

(ByVal hwnd As Long, lpdwProcessId As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias

"RtlMoveMemory" (Destination As Any, Source As Long, ByVal Length

As Long)

Private Declare Function ReadProcessMemory Lib "kernel32"

(ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any,

ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

Private Const STANDARD_RIGHTS_REQUIRED = &HF0000

P

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值