Wielokrotne zaznaczenie w eksploratorze windows

0

Otóz problem jest taki:
Zdefiniowałem własne rozszerzenie (umieściłem odpowiednie klucze w rejestrze) i teraz pliki określonego typu uruchamiają się w moim programie. Ok jest wszystko dla jednego pliku, ale gdy zaznaczam 10 plików np. to otwiera się 10 okien mojego programu. Chciałbym zrobić tak jak jest np. w winampie, ze wszystkie pliki są otwierane w jednym programie. Podpowiem, że przesyłanie danych z jednego programu do drugiego za pomocą SendMessage etc. się nie sprawdza :) Z tego co wyczytałem w internecie trzeba zrobić coś z IContextMenu jednak nie wiem jak się do tego zabrać. Proszę o pomoc i wskazówki ew. linki jak rozwiązać mój problem.
Dzięki z góry za poświęcony czas. :)

0

Dlaczego rozwiazanie z wysylaniem komunikatu skreslasz?

0

Bo takie rozwiązaniu już zaimplementowałem (byc moze zle :P), i sie nie sprawdza, tzn.
kazda instancja wczytywala z pliku handle okna i sprawdzala czy ten uchwyt wskazuje na okno (przez IsWindow()), jeżeli nie to zapisywała swoj uchwyt do pliku, tak by inne okna mogly odczytac ten uchwyt i przeslac do tego okna komunikat oraz natychmiast zakonczyc swoje dzialanie. Dziala to dla sytuacji kiedy zaznaczam jeden plik, wybieram otworz w moim programie, potem drugi plik oddzielnie, jednak kiedy zaznaczam 10 plikow i wybieram otworz w moim programie to otwiera sie dziesiec okien programu :)

0

Tak jak pisze foflik - czemu odrzucasz? Zrob tak jak w winampie wlasnie. Jak sobie lookniesz jakie sa parametry w ustawieniach to zrozumiesz. Niech program sie uruchamia, ale zanim stworzysz okienka i cala oprawe, itp to sprawdzaj, czy juz jedna instancja programu dziala. Jak tak to wyslij mu komunikat, ze sciezka pliku, zeby sobie go dodaj do listy, czy czegos tam, co tam masz i wylacz ta instancje Nie bedzie to zasobozerne, bo w momencie startu tylko tego kawalka w zasadzie program nic nie zajmuje - rozkreca sie dopiero przy odpalaniu okienek, itd. A jak inna instancja nie dziala, to niech startuje tak jak zawsze.

pozdrawiam
johny

0

Taaaaaak :D
Zle wtedy zaimplementowalem to sprawdzanie :D
Dziala jak należy, dzieki za odpowiedzi :)

1

Może coś w ten deseń:

#include <windows.h>

const char MAIN_WND_CLASS_NAME = "unikalna nazwa klasy głównego okna";
const char MAIN_WND_NAME = "unikalna nazwa głównego okna";

int main(int argc, char* argv[]) {
	HANDLE hInstanceLock = CreateMutex(NULL, FALSE, "unikalny identyfikator twojego programu");

	if (WaitForSingleObject(hInstanceLock, 100000) == WAIT_OBJECT_0) {
		for (int i = 0; i < 50; i++) {
			HWND hMainInstWnd = FindWindow(MAIN_WND_CLASS_NAME, MAIN_WND_NAME);
			if (hMainInstWnd == 0) break;
			if (SendMessage(hMainInstWnd, WM_COPYDATA, ***)) {
				ReleaseMutex(hInstanceLock);
				return 0;
			}
			Sleep(2000);
		}
	}

	/* tu inicjalizacja - tworzenie okna  MAIN_WND_CLASS_NAME/MAIN_WND_NAME, gotowość do odbierania komunikatów */

	ReleaseMutex(hInstanceLock);

	/* tu reszta aplikacji */

	return 0;
}

*** w tym miejscu podaj nazwę pliku do przesłania, więcej tu: Using Data Copy

No i oczywiście trzeba to jeszcze odebrać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1