/ / Ako zistiť, kedy sa vo formulári zobrazila schránka správ? - c #, formuláre

Ako zistiť, kedy bol pre formulár zobrazený textový odkaz? - c #, formuláre

V mojej aplikácii mám úlohu, ktorá beží na vlákne na pozadí. Keď sa v vlákne používateľského rozhrania zobrazí správa MessageBox alebo akýkoľvek modálny dialóg, potrebujem oznámenie v pozadí vlákna.

Aj keď to dokážem manuálne zavolaním nejakej funkcie pred zobrazením MessageBoxu, ale bude skvelé, ak to nemusím.

Napríklad:

backgroundThread.MessageShown(); // I do not want to call this explicitly every time!
MessageBox.Show("Task halted!");

Hádam, že by som tu mohol mať nejakú správu, na ktorú by som sa mohol napojiť. Existuje aj v hlavnom vlákne GUI nejaká správa / udalosť, ktorá sa vystrelí tesne pred zobrazením modálneho dialógového okna?

Dobre, tu je požiadavka. Mám niektoré úlohy, ktoré sa robia na vlákne používateľského rozhrania, a musím ukázať pokrok v samostatnom dialógovom okne, ktoré sa zobrazuje na pracovnom vlákne. Chápem, že to by mali byť úlohy, ktoré musia byť vykonané na pracovnom vlákne, ale súčasný scenár sa zatiaľ nedá zmeniť.

Každá vec funguje dobre, až na jednuzávada - ak je v vlákne používateľského rozhrania zobrazené okno so správou, skryje sa pod dialógovým oknom priebehu. Užívateľ teda nikdy nevie, že používateľské rozhranie čaká na vstup. Potrebujem spôsob, ako dostať upozornenie, že sa zobrazilo modálne dialógové okno a mal by som skryť dialógové okno postupu.

Práve teraz ho musím explicitne skryť tesne pred každým volaním na MessageBox.

Dúfam, že to vysvetľuje.

odpovede:

5 pre odpoveď č. 1

Nastavenie a Háčik CBT, Potom dostanete upozornenie na všetky vytvorené, aktivované, deaktivované a zničené okná. Potom pomocou GetWindowClass skontrolujte, či hWnd vytvorené / aktivované je v skutočnosti MessageBox.


2 pre odpoveď č. 2

vytvorte si vlastnú schránku správ, ktorá spustí udalosť pri volaní Zobraziť?


0 pre odpoveď č. 3

Ak je rodičom vášho MessageBox-u TopMost, váš MessageBox bude TopMost. Takže niečo ako ...

MessageBox.Show( new Form() { TopMost = true }, "Message and so forth ..." );

Môže to tiež fungovať pre vás ...

DllImport("user32.dll")]
public static extern int MessageBox(int hWnd, String text, String caption, uint type);

A prejsť MB_TOPMOST ako typ.