2012-05-11 11 views
5

Próbuję umieścić ikonę w zasobniku systemowym, a następnie nadać mu globalny skrót klawiaturowy do wykonywania funkcji.RegisterHotKey nie działa z niewidocznymi formularzami (C#)

Używam RegisterHotKey do ustawienia globalnego skrótu klawiaturowego i działa, jeśli widoczna jest główna forma powiązana z ikoną. Ale jeśli formularz jest niewidoczny, wówczas metoda WndProc nigdy nie jest wywoływana.

Wszelkie pomysły?

Edit: Co mam na myśli przez „ukryte” jest to, że dodaje się do głównego formularza:

protected override void OnLoad(EventArgs e) 
{ 
    hotKey = new GlobalHotkey(GlobalHotkey.WIN, Keys.T, this); 
    bool registered = hotKey.Register(); 
    Visible = false; 
    ShowInTaskbar = false; 
    base.OnLoad(e); 
} 

„zarejestrowany” jest widoczny jako „true”, a prace kluczowych skrótów w porządku, gdybym pomiń "Widoczne = fałszywe"; i "ShowInTaskbar = false;".

+2

Czy możesz pokazać próbkę kodu z wypróbowanej wersji? – ImGreg

+0

tak, pokaż swój kod, ponieważ nie powinno być żadnej różnicy, jeśli parametr RegisterHotKey HWND jest niewidoczny, wiadomości nadal są przetwarzane. –

+0

Nie będzie można zarejestrować skrótu przed utworzeniem okna. Czy to masz na myśli "widoczny"? –

Odpowiedz

4

Winforms działa wokół całkiem drakońskiego ograniczenia w winapi. Niektóre właściwości okna można określić tylko wtedy, gdy tworzone jest okno i nie można go później zmienić. Lub innymi słowy, są one określone w natywnym wywołaniu CreateWindowEx().

Działa to wokół wywołując ponownie CreateWindowEx(). Lub innymi słowy, zniszcz istniejące okno i utwórz je ponownie. To sprytna sztuczka, ale ma pewne skutki uboczne. Możesz zobaczyć odrobinę migotania na przykład, gdy nowe okno samo się maluje. Niektóre większe efekty uboczne są widoczne na przykład w TreeView. Wszystkie węzły zwiną się, gdy zostaną odtworzone. Trudne do uniknięcia jest zbyt wiele stanów związanych z oryginalnym oknem. W przypadku formularza właściwość ShowInTaskbar jest jedną z takich właściwości. Ale także RightToLeft, FormBorderStyle, ControlBox, etcetera.

Najbardziej istotnym efektem ubocznym jest ten, na który natrafisz. Odtwarzanie okna zawsze zmienia właściwość Handle, nieuchronnie. I to się nie udaje, gdy używasz RegisterHotKey() lub biblioteki, która używa tego, że wywołanie winapi wykorzystuje uchwyt okna. Więc kiedy Winforms niszczy to okno, nigdy więcej nie będzie wywołania zwrotnego.

Jest łatwa do naprawienia, po prostu używasz niewłaściwej procedury obsługi zdarzeń. Zamiast tego wywołaj zastąpienie dla metody OnHandleCreated. Ponownie uruchamia się po ponownym utworzeniu okna. Kolejną łatwą naprawą, ale nie prawie tak niezawodną, ​​jest ustawianie tylko właściwości takich jak ShowInTaskbar w konstruktorze.

4

Problem polega na tym, że ustawienie ShowInTaskbar na false zmienia uchwyt okna, co oznacza, że ​​hwnd przekazany do RegisterHotkey nie jest już ważny.

Zarejestrowanie klawisza skrótu po ustawieniu ShowInTaskBar działa poprawnie.

Powiązane problemy