własny tray - WinAPI

własny tray - WinAPI
0

Heh, chodziło mi ukrycie belki która pokazywała sie po minimalizacji(poza eksplorerem), poruszając temat Hooka, napomknąłeś o SPI_SETMINIMIZEDMETRICS, właśnie o taką opcje mi chodziło, googlując dalej natknąłem się na coś takiego:
http://www.codeplex.com/shell/Wiki/View.aspx?title=Shell%20Startup&version=8
nie trzeba zakładać żadnego hook'a aby ukryć tą belkę, wystarczy ustawić tę opcję, z flagą w strukturze ARW_HIDE i teoretycznie belek nie powinno już być, teoretycznie bo ta flaga coś nie chce działać i belki są dalej, nie mogę także wywalić ich poza ekran, jak bym nie ustawiał struktury MINIMIZEDMETRICS nie mogę się pozbyć belek z wyświetlanego obszaru(choć teoretycznie już sama flaga ARW_HIDE powinna to robić), zaraz mnie krew zaleje :-[

kod:

Kopiuj
MINIMIZEDMETRICS mm;    SystemParametersInfo(SPI_GETMINIMIZEDMETRICS,sizeof(MINIMIZEDMETRICS),&mm,SPIF_SENDCHANGE);
mm.iArrange|=ARW_HIDE;
SystemParametersInfo(SPI_SETMINIMIZEDMETRICS,sizeof(MINIMIZEDMETRICS),&mm,SPIF_SENDCHANGE);

czy też uzupełniając ręcznie strukturę wartościami(z uwzględnieniem ARW_HIDE) i tak nie mogę się pozbyc tych prymitywnych belek [glowa]

Rzeczywiście trzeba założyć Hooka, aby ARW_HIDE działało,

dzięki Sapero za twoją bardzo pomocną wypowiedź, wiesz pytam się, nie chcę tracić czasu na szukanie, skoro ktoś to wie i może mnie oświecić ;-)

No i moje kolejne denerwujące pytanie :)

Kwestia przekazywania fokusu pomiędzy oknami, otóż gdy kliknę na swoje okno, zostaje przekazany mu fokus, chcę zapobiec temu zjawisku, nie wiem na etapie jakiego komunikatu ustawiany jest fokus, ale jest to już wcześniej niż WM_NCHITTEST, także coś takiego nie będzie wystarczające:

Kopiuj
case WM_SETFOCUS:
SetFocus((HWND)wPar);
...

bo fokus nadal zostanie przekazany na ułamki sekund, ale zostaje przekazany, szukam odpowiedzi ale nie mogę zbyt wiele znaleźć,

co prawda wymyśliłem już inny sposób rozwiązania problemu, ale jest on trochę pokrętny i mocno kombinowany, więc wolałbym, zrobić to poprzez wykluczenie przyjmowania fokusu przez moje okno....

Pół dnia siedzę i zastanawiam się dlaczego to nie chce się załadować zaraz zgłupieje całkiem [glowa]

Moja Dllka:

Kopiuj
extern "C"
{

LRESULT CALLBACK NHookProc(int nCode,WPARAM wPar,LPARAM lPar)
{
  //coś tam
}

}

Exec:

Kopiuj
...
NHookDLL=LoadLibrary(L"NHook.dll");
  if(!NHookDLL) MessageBoxA(DskWnd,"bla bla bla.","Brak biblioteki \"NHook.dll\"",MB_ICONERROR);
  
  LRESULT(__stdcall *NHookProc)(int,WPARAM,LPARAM);
  NHookProc=(LRESULT(__stdcall *)(int,WPARAM,LPARAM))GetProcAddress(NHookDLL,"NHookProc");
  if(!NHookProc) MessageBoxA(DskWnd,"Nie można załadować funkcji \"NHookProc\".","Błąd biblioteki \"NHook.dll\"",MB_ICONERROR);
...

Nie mogę załadować NShellProc, pół dnia szukam powodu, na moje oko powinno to śmigać [glowa]
Exec jest w UNIKODZIE ale to chyba nie ma znaczenia bo nazwy funkcji win i tak zapisuje w ANSCI, znając życie błąd jest w małym szczególe którego nie zauważam przez pół dnia [glowa]

SA
  • Rejestracja:około 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
0

Zapomniałeś pewnie o __declspec(dllexport) na początku funkcji. W GetProcAddress podaj _NHookProc@12

0

Rzeczywiście, nie dałem tego [glowa] ... pół dnia dochodziłem dlaczego to nie chodzi :-O

Next pytanie :d

Sprawa tyczy się skrótów, czy WinAPI ma funkcje wspierające odczytyanie/zapisywanie skrótów, czyli plików z rozszerzeniem *.lnk

znalazłem opis tego formatu, ale po co pisać od zera funkcje odczytujące lnk'i skoro może WinAPI posiada już takie funkcje, co prawda nie natknąłem się na nic na necie, też przeszukałem winuser.h w poszukiwaniu "lnk" i "link", ale jedyne co znalazłem to Set/GetCaretBlinkTime, ale to oczywiście nie ma związku ze skrótami....

SA
  • Rejestracja:około 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
0

No jasne że ma, w shobjidl.h - interface IShellLink i IPersistFile

Kopiuj
IShellLinkW *link;
IPersistFile *ipf;
if (!CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)&link))
{
	if (!link->QueryInterface(IID_IPersistFile, (void**)&ipf))
	{
		ipf->Load(L"c:\\skróty\\xxx.lnk"); // zamknij w if (!)
		link->GetPath(wszExePath, sizeof(wszExePath), NULL, 0);
		link->GetIconLocation(wszIconPath, sizeof(wszIconPath), &iIndex);
		link->GetArguments(wszArgs, sizeof(wszArgs)); // /hide /tray ...

		ipf->Release();
	}
	link->Release();
}

IShellLinkA też działa, ale niektóre stringi muszą być unicode.

PK
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 14 lat
0

Przeglądałem ten post i zobaczyłem fragment kodu z wyliczaniem okien w celu wysłania do każdego z nich pewnego komunikatu. Po co się męczyć ? WinAPI wcale nie jest takie toporne jak się mówi:

Kopiuj
    SendMessage(HWND_BROADCAST,RegisterWindowMessage("TaskbarCreated"),0,0);

Powyższa linijka spowoduje wysłanie komunikatu, zwracanego przez RegisterWindowMessage(), do wszystkich okien w systemie.

//edit

Post wymaga edycji: powyższa funkcja działała, ale nie zawsze np. na początku gdy mój alternatywny shell się uruchamiał wraz z systemem, powodowała ona zawias całego systemu tj. nie dostawała odpowiedzi od któregoś z okien docelowych. Rozwiązaniem było użycie:

Kopiuj
    SendMessageTimeout(HWND_BROADCAST,RegisterWindowMessage("TaskbarCreated"),0,0,SMTO_ABORTIFHUNG,7000,0);

Czyli nastąpi wyjście z funkcji jeżeli przez 7 sekund nie ma odpowiedzi. Paradoksalnie ktoś chyba wcześniej o tym pisał, a straciłem cały dzień na znalezienie błędu.

Kolejna rzecz kosztowała mnie trzy dni. Aby prawidłowo obsłużyć menu kontekstowe pojawiające się często (po kliknięciu prawym przyciskiem myszy) w programach będących w zasobniku, należy główne okno do obsługi tray'a (klasa Shell_TrayWnd) uczynić oknem potomnym okna o stylu rozszerzonym WS_EX_TOPMOST - obsługa bezpośrednia tj. bezpośrednio na oknie ze stylem WS_EX_TOPMOST powodowała niemożliwość wyłączenia menu kontekstowego danego programu (trzeba było kliknąć w to menu i wykonać jakąś akcję, wtedy się wyłączało np. poprzez zmianę statusu na Skype).

I jeszcze jedno. Swojego tray'a zaimplementowałem bez zbędnej obsługi obiektów COM oraz stworzyłem tylko jedno okno o klasie Shell_TrayWnd (wcześniejszy kod proponował stworzenie dodatkowego okna Shell_TrayNotify - nie rozumiem w jakim celu). W razie potrzeby mogę zarzucić kodem i jeszcze muszę się pochwalić moim tworem ;] :

http://romanzenek.webpark.pl/screen.jpg


1010011010 The Number Of The Beast !

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.