koordinaten von desktopverknüpfungen
-
sorry ich blicks leider noch nich so in der winapi :p
aber ich möchte gerne noch wissen, ob es möglich ist die koordinaten einer z.b. bestimmten desktopverknüpfung zu ermitteln ( z.b. arbeitsplatz)
wenn ja, wie macht man sowas ?
mfg haMMer
-
Es gibt ein Fenster namens "Program Manager" (Klasse:"Progman"), das hat ein Kindsfenster der Klasse "SHELLDLL_DefView" und dieses wiederum hat ein ListviewControl als Kindsfenster. Jetzt musst du nur noch dessen Handle ermitteln und dann kannst du mit dem entsprechenden ListView-Macro die Position ermitteln.
So eine ähnliche Frage wurde glaube letztens erst gestellt, nutz mal die Suchfunktion (Stichwort "Listview" oder "ListView_GetItemPosition" oder "ListView_SetItemPosition").
-
also die ListView_GetItemPosition() erkennt er bei mir nich ..
-
mööp, hab commctrl.h vergessen...
-
So und jetzt das ganze noch in eine DLL und in den Explorer-Prozess injizieren. Sonst kommst du nicht an den Listview ran. :p
-
test...
-
hehe, gut dass man auch unregistriert Beiträge posten kann...!
hock nämlich grad im Computerraum von der FH un weiss mein passwort ned ...was ich sagen wollte... :
das mit dem ListView, also ich muss das dann praktisch wie Hooks behandeln , also es geht nur in einer dll ? naja aber dafür n hook zu setzen, is das notwendig ? oder reicht es einfach das alles mit dem handle und der GetItemPosition funktion in einer externen funktion zu packen und die dann einfach in der exe über die dll auszuführen ?
und was ist mit dem index in der ListView_GetItemPosition(), ich setze den 0, is das für arbeitsplatz ?? oder kann ich damit auch andere desktop items ermitteln, indem ich einen anderen index setze ?
mfg haMMer
-
also ich hab probs... ich bekomm den POINT nich vom arbeitsplatz aufm desktop !
POINT pIcon;
HWND hWndListView = GetWindow(GetWindow(FindWindow(TEXT("ProgMan"), NULL), GW_CHILD), GW_CHILD);
ListView_GetItemPosition(hWndListView,0,&pIcon);
bei mir bleibt pIcon.x und pIcon.y = 0 ...(upper left corner)
was mach ich falsch ??
(win2k)und ich hab mich nochmal erkundigt, manche sagen, dass es unsinn ist, das unbedingt in ner dll machen zu müssen...
-
und ich hab mich nochmal erkundigt, manche sagen, dass es unsinn ist, das unbedingt in ner dll machen zu müssen...
Dann frag die Manchen mal, ob sie schon mal was von getrennten Adressräumen gehört haben. Der übergebene Pointer ist im anderen Process hedenfalls nicht gültig.
-
naja ob dll hin oder her, ich hab keine ahnung ob die zeile
HWND hWndListView = GetWindow(GetWindow(FindWindow(TEXT("ProgMan"), NULL), GW_CHILD), GW_CHILD);den arbeitsplatz handle angibt...
ich bekomm immer upperleftcorner als x y !wäre net wenn einer mal das problem anpacken könnte und es selbst testet, und mir dann den richtigen pfad gibt sofern der obige nich stimmt.....
also bei mir würd das in der dll so aussehen:
extern "C" __declspec(dllexport) POINT GetpItem(POINT pItem) { HWND hWndListView = GetWindow(GetWindow(FindWindow(TEXT("ProgMan"), NULL), GW_CHILD), GW_CHILD); ListView_GetItemPosition(hWndListView,0,&pItem); return pItem; }
[ Dieser Beitrag wurde am 17.03.2003 um 21:32 Uhr von Hammer editiert. ]
-
ich glaub ich stecks mit dem listview,
ich krieg den handle net raus, oder ich mach was anderes falsch...k.a.
der punkt den ich rauskrieg is jedesmal etwa -20, -20, was aber net stimmtwenn einem was dazu einfallen sollte kann er ja noch posten, wäre dankbar für jede hilfe !
ansonsten muss ich halt den gag weglassendas problem ist, das wissen nur die ganz erfahrenen coder, und von denen auch nur 10 %
[ Dieser Beitrag wurde am 19.03.2003 um 17:24 Uhr von Hammer editiert. ]
-
Original erstellt von Luckie:
So und jetzt das ganze noch in eine DLL und in den Explorer-Prozess injizieren...hm, hab mit dlls noch nicht viel gemacht ... kann mal jemand erklären, wie das geht, also das injizieren einer dll in einen anderen prozess?
halt stop ... die FAQ´s offenbaren folgendes:
Fensterprozedur eines fremden Child-Fensters ersetzengut ... also so wird eine dll injiziert, aber wie benutz man denn dann die dll? ich meine, um bei dem problem zu bleiben: würde es denn dann reichen eine dll zu schreiben, die eine Funktion
extern "C" __declspec(dllexport) POINT GetDesktopItemPosition(int nIndex);
implementiert, diese dll mit LoadLibrary() in meinem eigenen programm zu laden und die funktion darin ausführen????
grüsse
-
hab mal nachgegrübelt, und bin zu folgender theorie
gekommen:
ich kann meine eigene frage mit ja beantworten, denn:
Ich Rufe GetDesktopItemPosition() meiner dll auf. Diese wiederum ruft ListView_GetItemPosition() auf, und übergibt ihr einen pointer aus dem adressbereich der dll. Da dieser, durch das injizieren der dll, in den adressbreich des explorer-prozesses gemappt wurde, ist der pointer also gültig. Nachdem die dll also erfolgreich die position ermittelt hat, kann sie es mir jetzt problemlos mitteilen, weil ja auch mein programm den addressbereich der dll gemappt hat.
hab ich das richtig verstanden ??? oder bin ich da voll aufm holzweg ... klärt mich bitte auf
grüsse
[ Dieser Beitrag wurde am 20.03.2003 um 03:24 Uhr von soUrcerer editiert. ]
-
Original erstellt von soUrcerer:
Nachdem die dll also erfolgreich die position ermittelt hat, kann sie es mir jetzt problemlos mitteilen, weil ja auch mein programm den addressbereich der dll gemappt hat.Hä? Es ist dabei doch so ziemlich egal, ob die DLL in deinem Prozess dranhängt oder nicht. Du brauchst doch nur 2 absolute Werte für eine Position, also keine Zeiger. Hauptsache, die DLL hängt im Explorer drin.
-
hey wenn einer für mich das prob mit dem listview lösen könnte,
schick ich ihm als belohnung das komplette prog als zip, da es ab dann schon fertig wäre :pich brauche den genauen handle vom Item "Arbeitsplatz" für win2k/xp/9x
und ich will den kompletten code gepasted bekommen, sonst kriegt ihr nixoder ich schick euch ne flasche bier per post
sucht euch ne marke aus
-
Original erstellt von WebFritzi:
Hä? Es ist dabei doch so ziemlich egal, ob die DLL in deinem Prozess dranhängt oder nicht. Du brauchst doch nur ...Was ich "nur brauche" war nicht meine frage ! Sondern, ob ich mit meiner theorie richtig liege.
was wäre nun, wenn meine funktion (innerhalb der dll) so aussähe?
void GetDesktopItemPosition(int nIndex, LPPOINT pPoint);grüsse
-
Original erstellt von <Hammer>:
hey wenn einer für mich das prob mit dem listview lösen könnte...fauler sack
grüsse
-
fauler sack
hmm, naja wenn ich aber momentan mit meinem wissen bei dem problem an meine grenzen stoße, dann kann ich noch so fleissig sein, ich bleib trotzdem hängen....
-
Original erstellt von soUrcerer:
was wäre nun, wenn meine funktion (innerhalb der dll) so aussähe?
void GetDesktopItemPosition(int nIndex, LPPOINT pPoint);Ein paar Beiträge vorher hast du aber eine andere Funktion stehen. Du musst schon sagen, wenn es dir nur sozusagen ums Prinzip geht.