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