Wykrycie zapisu w notatniku

0

Na wstępie przepraszam jeżeli taki (albo podobny) temat już był, ale nawet za bardzo nie wiem, jak czegoś takiego szukać.

Napisałem sobie konwerter (zamienia zakodowany plik, w zwykły txt). Dodałem do menu pod prawym przyciskiem, specjalną opcję, która wyświetla się, po kliknięciu na ten zakodowany plik (jest to po prostu "Decode").

Gdy odpalę to "Decode", chcę by został wykonany następujący proces:

  1. Mój program uruchamia się (i działa w tle, nawet go nie widać).
  2. Odkodowuje dany plik i zapisuje go gdzieś tam do XXX (wszystko jedno gdzie, to nie ważne).
  3. Program automatycznie otwiera odkodowany plik za pomocą windowsowego notatnika i zwija się do traya, czekając na dalsze instrukcje.
  4. Gdy użytkownik skończy pracę z plikiem, klika na zapisz (standardowa opcja w notatniku). Program wyłazi z traya, zakodowuje plik i zastępuje nim ten stary.

Czyli jak widać, coś na kształt bardzo oszczędnego (pod względem formy), edytora. Problem mam taki jak w temacie: Jak przechwycić polecenie "zapisz" z notatnika, by mój program wiedział że ma wkroczyć do akcji? Chciałbym też wykryć moment zamknięcia notatnika (bez zapisywania), by mój program wiedział, że ma po prostu usunąć ten odkodowany plik (na którym pracował użytkownik, ale zmian nie wprowadził, więc nie ma potrzeby jego zakodowywania). Jest to w ogóle możliwe? Można liczyć na jakąś podpowiedź jak się za to zabrać? Chodzi o obsługę komunikatów? A może trzeba przechwycić okno notatnika? Sam nie wiem...

Wiem że mogę zwyczajnie napisać prosty edytor tekstu i w nim edytować plik, ale coś takiego już mam. Terach chcę to maksymalnie zminimalizować (ciekawe wyrażenie ;P) i uprościć.

0

Chciałbym też wykryć moment zamknięcia notatnika
To będzie najprostsze. Uruchamiasz program przez CreateProcess, i wtedy mając uchwyt na utworzony proces, czekasz na jego zamknięcie przez WaitForSingleObject.
Potem sprawdzasz czy data modyfikacji pliku się w międzyczasie zmieniła — jeśli nie, to plik zamknięto bez zapisywania.

0

Trzeba by wiedzieć w jaki sposób prawidłowo "dodać" nową pozycję do menu kontekstowego (ppm), by po kliknięciu na niego został uruchomiony Twój program z dodatkowym parametrem, którym będzie ścieżka pliku, który chcesz dekodować; Sam program możesz napisać tak, jak to się normalnie robi z tą różnicą, że nie będzie posiadać formularza lub będzie, ale nie zostanie pokazany; Ścieżkę docelową dla odkodowanego pliku możesz kontrolować przez wyświetlenie okna dialogowego, w którym użytkownik wpisze lub wybierze katalog; Resztę operacji powinieneś znać i wiedzieć jak zastosować; Aplikacje "chowane" do tray'a też można prosto napisać, w google jest mnóstwo przykładów; No i to co pisze @Azarien wykorzystaj do przechwycenia zamknięcia pliku;


Gdybym ja miał napisać taki program, to zrobiłbym swój edytor tekstowy na kształt systemowego notatnika i to by wystarczyło; Nie trzeba by w ogóle kombinować, tylko najnormalniej w świecie napisać zwykły edytor z tą różnicą, że odczytując zakodowany plik z dysku przed wyświetleniem jego zawartości zostałby odkodowany, a w procesie zapisu zakodowany; No, ale jak nie chcesz pisać swojego edytorka to będziesz musiał trochę poczytać; Ja jednak obstawiałbym przy stworzeniu swojego edytora + powiązanie danego rozszerzenia z tym edytorem; Taki edytor bez bajerów można w jeden dzień machnąć, góra dwa + konkretny własny (prosty) instalator, żeby ręcznie nie dodawać odpowiednich kluczy do rejestru i operować na plikach; Zrób jak chcesz;


Poczytaj o tym jak za pomocą swojego item'a w menu spod ppm otworzyć konkretny plik wykonywalny z parametrem; Z resztą sobie poradzisz;

0

Furious Programming

Tylko ja o tym wszystkim o czym tu napisałeś, wiem. Umiem dodać opcję do menu kontekstowego i otwierać program z parametrem. Chodzi tylko o wykrycie chwili zapisu...

PS. Napisałem w pierwszym poście, że zwykły edytor już stworzyłem. Teraz chcę napisać coś takiego, ale chyba mam pomysł na alternatywę....

1

Jeżeli chcesz monitorować plik, gdy notatnik jest ciągle uruchomiony użyj FindFirstChangeNotification i pokrewnych.

0
Azarien napisał(a)

Chciałbym też wykryć moment zamknięcia notatnika
To będzie najprostsze. Uruchamiasz program przez CreateProcess, i wtedy mając uchwyt na utworzony proces, czekasz na jego zamknięcie przez WaitForSingleObject.
Potem sprawdzasz czy data modyfikacji pliku się w międzyczasie zmieniła — jeśli nie, to plik zamknięto bez zapisywania.

Ale jak? W opisie funkcji WaitForSingleObject na stronie MS, są tylko ogólniki. Wiem że należy go połączyć z inną funkcją (np. tą którą podał Rev), ale nie wiem jakiej powinienem użyć, by wykryć zamknięcie pliku...

0

Tak, dokumentacja do WaitForSingleObject() jest ogólnikowa, bo ta funkcja jest ogólna. Jej zadaniem jest czekanie „na coś”. Jeśli tym czymś będzie uchwyt procesu (patrz dokumentacja CreateProcess()), to czekanie będzie trwało aż do zamknięcia programu:

(* DISCLAIMER: to ja się produkuję z przykładem w C, a tu widzę że pytanie jest
               w dziale o Delphi... no cóż, wybacz, nie będę już przerabiał... *)
#define UNICODE

#include <stdio.h>
#include <locale.h>
#include <windows.h>

int main() {
	setlocale(LC_CTYPE,".1250");

	printf("uruchamiam program...");

	// CreateProcess przyjmuje mnóstwo parametrów,
	// z czego większość jest nam zbędna...

	STARTUPINFO si;
	memset(&si, 0, sizeof(si));
	si.cb = sizeof(si);

	PROCESS_INFORMATION pi;
	memset(&pi, 0, sizeof(pi));

	if (CreateProcess(L"c:\\windows\\system32\\notepad.exe", NULL,
	    0, 0, FALSE, 0, NULL, NULL, &si, &pi)) {
		printf("czekam na zamknięcie...");
		WaitForSingleObject(pi.hProcess, INFINITE);
		printf(" zamknięto\n");
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
	}
	else {
		printf(" błąd\n");
	}
}
0

czym jest pi? Czy to uchwyt do tego nowo stworzonego procesu?

0

uchwytem jest pi.hProcess. pi to struktura zawierająca ten uchwyt i inne śmieci.

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