Программно кликнуть по иконке на рабочем столе

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
Serg.A.S
Сообщения: 2
Зарегистрирован: 17 июл 2007, 00:09

Здравствуйте.
Я только начинаю программировать, потому вопрос может показаться глупым.
Ситуация такая:
1) Узнаю HWND рабочего стола (ака ListView с иконками)

Код: Выделить всё

	HWND hWnd = FindWindow("ProgMan", NULL);
	hWnd = GetWindow(hWnd, GW_CHILD);
	hWnd = GetWindow(hWnd, GW_CHILD);
2) Узнаю число иконок на десктопе:

Код: Выделить всё

	DWORD dwCount = SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0);
	printf("%d icons on desctop\n", dwCount);
А теперь я хочу сэмитировать двойной клик по иконке с заданным ID, притом хочу чтобы оно работало даже тогда, когда иконка закрыта каким-то окном. Пробовал копать в сторону SendMessage и WM_LBUTTONDBLCLK или NM_DBLCLK, но все безрезультатно.

Помогите, пожалуйста, нубу.
Serg.A.S
Сообщения: 2
Зарегистрирован: 17 июл 2007, 00:09

Да, хочу напомнить, все необходимые структуры и константы объявляются в commctrl.h
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Serg.A.S,
А если пойти "другим путем".
Известно же, что "Рабочий стол" - это каталог на диске в определенном его (диска) месте. Иконки - это файлы типа (с расширением *.lnk). Папки - подкаталоги.
Для "шелчка по иконке" достаточно будет выполнить ShellExecute на этот самый файл.

Расположение каталога "Рабочий стол" , как будто можно взять из реестра. Но это ч методом "анализа" нашел. Возможно, где-то это и строго документировано:

раздел реестра:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders]
Переменная:
Desktop
ssDev
Сообщения: 50
Зарегистрирован: 20 янв 2005, 14:41

Вот пример управления мышкой
#include <windows.h>
int main(int argc, char* argv[]){
mouse_event(MOUSEEVENTF_MOVE,200,200,0,0);
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
return 0;
}
остается только найти координаты иконки (это тоже должно просто решатся)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Во-первых, чтобы получить путь к каталогу рабочего стола следует использовать Shell функцию SHGetSpecialFolderPath. Это если использовать подход, предложенный господином BBB.

Во-вторых, есть ещё один вариант. В моём понимании он даже более правильный. Полностью перейти на Win Shells (понадобятся базовые знания COM). В этом случае читать в MSDN о следующих интерфейсах: IShellLink, IActiveDesktop. Поверь мне, с помощью них можно сделать всё, что угодно с рабочим столом и иконками на нём.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Честно говоря, не совсем понятен смысл данного действия. Если известно имя ярлыка на рабочем столе или в каком-то другом месте, то должно быть известно и имя файла, на который он ссылается. Нельзя ли программно напрямую открывать сам этот файл, а не через ярлык? Предположим, в ярлыке могут быть изменены какие-то параметры запуска приложения. Но так эти же настройки можно хранить и не в ярлыке, а в каком-нибудь INI-файле или в реестре.
Ответить