2008-09-25 15 views
23

Birkaç yıl önce, bazı olayları sıfırladığında onları yerlerine sürüklemekten bıktığım için taktik olarak yerleştirilmiş masaüstü simgelerini kaydetmek için küçük bir uygulama yazmaya çalıştım. WAY'ı yaktıktan sonra vazgeçtim çok fazla zaman sorgulama yolunu bulamadım, daha az kaydetme ve sıfırlama, simgelerin masaüstünün konumu.Windows masaüstü simgesi konumlarını program aracılığıyla nasıl değiştirebilirim?

Windows'un bu bilgiye nerede devam ettiğini ve bunları ayarlamak için bir API olup olmadığını bilen var mı?

sayesinde Richard

cevap

10

Yanılmıyorsam, masaüstü yalnızca bir ListView'dir ve masaüstünün tanıtıcısına LVM_SETITEMPOSITION mesajını göndermeniz gerekir.

Bazı C# kodları için biraz uğraştım ve bir örnek bulamadım, ancak aşağıdaki makaleyi buldum. Torry: ...get/set the positions of desktop icons?. Bu delphi kodu, ama çok okunabilir ve bazı P/Invokes ile bunu C# 'a çevirebileceksiniz.

+0

Bu kodu temel olarak kullanmaya başladım, ancak ondan bir şeyler alırken, bir yanıt olarak gönderdiğiniz bağlantıyı buldum, bu yüzden size cevabı vereceğim, teşekkürler. – ZeroBugBounce

+0

Bu linkler şu anda çöp gibi görünüyor ... –

0

Ben API hakkında hiçbir fikrim yok, ama ben simge konumunu koruyarak için kullandım hiç rağmen ben (UltraMon (http://www.realtimesoft.com/ultramon/) bir özellik simgesi yerleştirme korumak için yer verdi biliyorum, öyle çoklu monitör kullanımı için vazgeçilmezdir). En yeni beta sürümü, Vista ile sorunsuz çalışır (bazen RDP ile başlangıçta makineme giriş yaparken küçük bir aksaklık veya ikiye sahip olmak dışında) ve elbette XP ile herhangi bir sorun yaşamadı. Bunu dört yıldan beri kullandım.

Birden fazla monitör kullanımı için en iyi yardımcı program olduğundan bahsetmiş miydim?

2

Masaüstü yalnızca bir ListView denetimidür ve LVM_SETITEMPOSITION kullanarak ilgili simgeleri taşımak için tanıtıcısını alabilir ve iletilere mesaj gönderebilirsiniz.

LVMGETITEMPOS kullanarak simge konumlarını almak biraz daha karmaşıktır. Bir POINT yapısına bir işaretçiyi LPARAM'nız olarak geçirmeniz gerekir. Bunu yapmaya çalışırsanız, muhtemelen Explorer'ı kilitlersiniz. Sorun, adres alanınızda, kontrolcünün Explorer'in adres alanında bir işaretçi olarak yorumlandığı bir işaretçiyi geçtiniz. Ah!

Kullandığım çözüm, Explorer işlemine bir DLL yerleştirip iletiyi oradan göndermektir. Öyleyse konum bilgisini sürecinize geri döndürmenin bir yolu olmalı.

+2

Bir DLL enjekte etmeniz gerekmeyebileceğini unutmayın: mesajı proc dışında gönderebilir ve kaşifin süreç alanında hafızayı ayarlamak için VirtualAllocEx ve Read/WriteProcessMemory kullanabilirsiniz. böylece geçerli bir LPARAM işaretçisinin (kaşifin bakış açısından) kullanması için. Bu şekilde kendi işleminize geri dönmeniz veya ayrı bir DLL ile uğraşmanız gerekmez. – BrendanMcK