Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!

1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!

Saving desktops icons dosen't work...

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Vortez   Crossbones+   -  Reputation: 2705


Posted 29 September 2012 - 03:52 PM

Hi everyone, im trying to make a small project but i ran into a snag. The goal is to save the position of my icon on the
desktop so that if they get messed up by, say, an old game of mine that swich resolution, i could rearrange them with
the push of a button. Seem simple enough.

The first thing i've done is check with Spy++ what kind of control it was, it's a syslistview32, so, basically, a listview.
So, i started by sending the LVM_GETITEMCOUNT message to it to get the number of icons, it worked. So far, so good. If i add or
delete some icons, the number change accordingly. Then, that's when it get weird... When i try to get the position of each
icon, using the LVM_GETITEMPOSITION message, or by using the macro ListView_GetItemPosition that do the same exact thing,
the POINT structure im passing is not getting filled. The same thing happen when trying to get the text with LVM_GETITEMTEXT.
The weird thing is, if i monitor the message LVM_GETITEMPOSITION for example, using Spy++, i can see that my messages have
been sent and received, and i can see the value that should be in my POINT structure, but it's not there...
I can't see what the hell is going on.

Here's the code:
#include "Windows.h"
#include "COMMCTRL.H"
void main()
// The window always have this handle on XP, unless it crash...
DWORD DesktopHandle = 0x00010088;
// A little kludge...
HWND hDesktop = NULL;
memcpy(&hDesktop, &DesktopHandle, 4);

// This work (both of em)...

//int NumItems = SendMessage(hDesktop, LVM_GETITEMCOUNT, 0, 0);

int NumItems = ListView_GetItemCount(hDesktop);

for(int Cpt = 0; Cpt < NumItems; Cpt++){

  POINT Pos;
  ZeroMemory(&Pos, sizeof(POINT));
  // This dosen't work (again, both of em)

  //SendMessage(hDesktop, LVM_GETITEMPOSITION, Cpt, (LPARAM)(&Pos));
  ListView_GetItemPosition(hDesktop, Cpt, (LPARAM)&Pos);

If anyone could help me, that would be great, Thx.


#2 ShadowValence   Members   -  Reputation: 380


Posted 29 September 2012 - 05:28 PM

Try using Fences (see the link below)! These are a time saver when I remote into my dual screen work PC from a single screen machine. Because I've saved my how my fences are setup (through their GUI) they automatically re-position themselves when I return to sitting directly in front of my work machine.


#3 Endurion   Crossbones+   -  Reputation: 3847


Posted 29 September 2012 - 11:32 PM

Vortez: You're passing a local pointer to a different application with its own heap. For that other application that pointer is probably pointing into invalid territory.

You need to allocate memory in the explorer process with VirtualAllocEx and use ReadProcessMemory and WriteProcessMemory to access it. Also, be sure to chose the right bitness (32bit vs. 64bit).
Fruny: Ftagn! Ia! Ia! std::time_put_byname! Mglui naflftagn std::codecvt eY'ha-nthlei!,char,mbstate_t>

#4 Vortez   Crossbones+   -  Reputation: 2705


Posted 28 October 2012 - 10:32 PM

Thx a lot dude, it work now!

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.