Red de conocimiento informático - Problemas con los teléfonos móviles - Problemas con Shell_NotifyIcon

Problemas con Shell_NotifyIcon

Hay un área empotrada en la barra de tareas del escritorio de Windows, que muestra el reloj del sistema y algunos iconos. Esta área rectangular es el área de estado de la barra de tareas de Windows (área de estado de la barra de tareas). Este artículo presentará la programación del área de estado de la barra de tareas usando Borland Delphi, es decir, cómo mostrar el ícono de la aplicación en el área de estado de la barra de tareas.

---- Principio de implementación

---- Agregar, eliminar y modificar íconos en el área de estado de la barra de tareas se implementa a través de la función API de Windows Shell_NotifyIcon, que es proporcionada por Provided. por la biblioteca de enlaces dinámicos SHELL32.DLL de Windows. En Delphi, la función Shell_NotifyIcon se declara en la unidad ShellAPI y su

---- prototipo de función es el siguiente:

---- function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData ): BOOL; stdcall;

---- El valor del parámetro dwMessage determina el tipo de operación que realizará la función Shell_NotifyIcon. /p>

---- NIM_ADD (el valor es 0): inserta un icono en el área de estado de la barra de tareas.

---- NIM_DELETE (el valor es 1): elimina un icono del área de estado de la barra de tareas.

---- NIM_MODIFY (el valor es 2): modifica el icono, la información de solicitud o el mensaje de notificación en el área de estado de la barra de tareas.

----El parámetro lpData es un puntero a un tipo de registro (tipo de estructura). El tipo de registro NotifyIconData se define de la siguiente manera:

NOTIFYICONDATA = registro

<. p> cbSize: DWORD;

Wnd: HWND;

uID: UINT;

uFlags: UINT

uCallbackMessage: UINT;

hIcon: HICON;

szTip: matriz [0..63] de AnsiChar

fin

---- cbSize: tamaño del registro NOTIFYICONDATA.

---- Wnd: el identificador de ventana asociado con este icono del área de estado. Esta ventana será responsable de procesar el mensaje uCallbackMessage.

---- uID: El identificador del icono del área de estado personalizado por el programa.

---- uFlags: Este campo indica qué valores de los tres miembros uCallbackMessage, hIcon y szTip en el registro NOTIFYICONDATA son válidos. Su valor puede ser una combinación de los siguientes tres (u operación):

---- NIF_MESSAGE (el valor es 1): el elemento uCallbackMessage contiene información válida.

---- NIF_ICON (el valor es 2): El elemento hIcon contiene información válida.

---- NIF_TIP (el valor es 4): El elemento szTip contiene información válida.

---- uCallbackMessage: Identificador de mensaje definido por el programa (entero de 32 bits). Cuando el mouse se mueve o hace clic en el ícono del área de estado (es decir, ocurre un evento del mouse), el sistema operativo enviará un mensaje uCallbackMessage a la ventana especificada por Wnd.

En el mensaje uCallbackMessage, el parámetro lParam contiene el tipo de mensaje del mouse de Windows y el parámetro wParam contiene el identificador de icono (uID). Los mensajes válidos del mouse incluyen los siguientes: WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONUP, WM_MBUTTONUP, WM_MOUSEMOVE, WM_LBUTTONDBLCLK, WM_RBUTTONDBLCLK y WM_MBUTTONDBLCLK.

---- hIcon: especifica un identificador de icono.

---- szTip: Información del consejo que se muestra en el icono (menos de 63 caracteres).

---- Implementación en Delphi

---- De la introducción anterior, no es difícil ver que la programación del área de estado de la barra de tareas maneja principalmente dos aspectos del trabajo. : Agregar, eliminar, modificar íconos y procesar mensajes de notificación. Se pueden agregar, eliminar y modificar íconos llamando a la función Shell_NotifyIcon. Para mensajes de notificación personalizados, debemos procesarlos en el bucle de mensajes.

---- El siguiente ejemplo brinda ejemplos de cómo agregar, modificar y eliminar íconos en el área de estado, así como el marco de procesamiento básico de los mensajes de notificación de íconos.

unidad Unidad1;

interfaz

usa

Windows, Mensajes, SysUtils, Clases, Gráficos,

Controles, formularios, cuadros de diálogo, ExtCtrls, ShellAPI

const

WM_TRAYNOTIFY=WM_USER+1;//Definir tipo de mensaje de notificación

TForm1 = clase(TForm)

Temporizador1: TTimer;

procedimiento FormCreate(Remitente: TObject);

procedimiento Timer1Timer(Remitente: TObject); p> p>

procedimiento FormDestroy(Remitente: TObject);

privado

{ Declaraciones privadas }

público

{ Declaraciones públicas }

procedimiento WndProc(var Msg: TMessage);

fin

var

Form1: TForm1; /p >

nd0, nd1:NotifyIconData;

hs:array[0..9]de LongWord

implementación

{$R *; .DFM }

procedimiento TForm1.FormCreate(Sender: TObject);

begin

//Carga los 10 recursos de iconos Icon0..Icon9,

Y guarda sus identificadores.

//Los iconos Icon0..Icon9 corresponden a los nueve números 0..9 respectivamente.

hs[0]:=LoadIcon(hInstancia, 'Icon0');

hs[1]:=LoadIcon(hInstancia, 'Icon1'); > hs[2]:=LoadIcon(hInstancia, 'Icono2');

hs[3]:=LoadIcon(hInstancia, 'Icono3');

hs[4]: =LoadIcon(hInstancia, 'Icon4');

hs[5]:=LoadIcon(hInstancia, 'Icon5');

hs[6]:=LoadIcon(hInstancia, ' Icon6');

hs[7]:=LoadIcon(hInstancia, 'Icon7');

hs[8]:=LoadIcon(hInstancia, 'Icon8'); p> p>

hs[9]:=LoadIcon(hInstance, 'Icon9');

//Rellene la variable de registro NotifyIconData nd0

nd0.cbSize := sizeof (NotifyIconData );

nd0.Wnd := mango;

nd0.uID := 0

nd0.uFlags := NIF_MESSAGE o NIF_ICON o NIF_TIP;

p>

nd0.uCallbackMessage := WM_TRAYNOTIFY

nd0.hIcon := hs[0]

StrPLCopy(nd0.szTip, ' ¡Hola, mundo!', 63 );

//Rellene la variable de registro NotifyIconData nd1

nd1.cbSize := sizeof(NotifyIconData

nd1); Wnd := mango;

p>

nd1.uID :=

nd1.uFlags := NIF_MESSAGE o NIF_ICON o NIF_TIP

nd1; .uCallbackMessage := WM_TRAYNOTIFY;

nd1.hIcon := hs[0];

StrPLCopy(nd1.szTip, 'Simon ama a Daisy', 63

<); p> //Agregar un ícono al área de estado de la barra de tareas

Shell_NotifyIcon(NIM_ADD, @nd0);

Shell_NotifyIcon(NIM_ADD, @nd1);

procedimiento TForm1.Timer1Timer( Remitente: TObject

var

st:SystemTime

begin

<; p> //Actualiza el ícono cada segundo: ícono 0 Muestra las decenas de segundos,

El ícono 1 muestra las unidades de segundos.

GetLocalTime(st);

nd0.hIcon:= hs[st.wSecond div 10];

nd1.hIcon:= hs[st.wSecond] mod 10];

//Modificar el icono en el área de estado de la barra de tareas

Shell_NotifyIcon(NIM_MODIFY, @nd0);

Shell_NotifyIcon(NIM_MODIFY, @nd1); ;

end;

procedimiento TForm1.FormDestroy(Sender: TObject);

comenzar

//Eliminar el icono de la barra de tareas. área de estado Eliminar

Shell_NotifyIcon(NIM_DELETE, @nd0);

Shell_NotifyIcon(NIM_DELETE, @nd1); /Procesando mensaje de notificación

procedimiento TForm1.WndProc(var Msg: TMessage);

var

IconID:integer

pt: TPOINT;

comenzar

si msg.Msg = WM_TRAYNOTIFY entonces

comenzar

{

En la notificación mensaje, El parámetro wParam es el uID del icono,

El parámetro lParam es el tipo de evento del mouse.

}

iconID := msg.WParam;

//Obtener la posición del mouse en la pantalla

GetCursorPos(pt ) ;

// La estructura básica del procesamiento de mensajes de notificación es la siguiente:

case msg.lParam de

WM_LBUTTONDOWN:

comenzar

//Se presiona el botón derecho del mouse

fin

WM_RBUTTONDOWN:

comenzar

//El botón izquierdo del ratón La tecla está presionada

end

WM_LBUTTONUP:

comenzar

//Suelta el botón izquierdo del ratón

fin;

WM_RBUTTONUP:

comenzar

//Suelta el botón derecho del ratón

fin; /p>

WM_MOUSEMOVE:

comenzar

//Pase el mouse sobre el ícono

finalizar

WM_LBUTTONDBLCLK:

comenzar

//Doble clic con el botón izquierdo del mouse

finalizar

WM_RBUTTONDBLCLK:

comenzar <; /p>

//Doble clic con el botón derecho del ratón

end;

end; //finalizar caso

end

else//Llame al método WndProc de la clase principal para procesar otros mensajes

heredado

end

end.

上篇: ¿Para qué se utiliza el algoritmo de programación Qos?La función de qos: el nombre completo en inglés de qos es "Quality of Service" y el nombre chino es "Quality of Service". Qos es un mecanismo de seguridad de la red y una tecnología utilizada para resolver problemas como el retraso y la congestión de la red. Generalmente, qos no es necesario si la red solo se usa para aplicaciones específicas que no tienen un límite de tiempo, como aplicaciones web o configuraciones de correo electrónico. Pero para aplicaciones críticas y aplicaciones multimedia, qos es necesario. Cuando una red está sobrecargada o congestionada, QoS garantiza que el tráfico crítico no se retrase ni se caiga y que la red funcione de manera eficiente: 1. Clasificación La clasificación es la capacidad de una red con QoS para identificar qué aplicaciones generan qué paquetes. Sin clasificación, la red no puede determinar qué procesamiento realizar en un paquete específico. Todas las aplicaciones dejan etiquetas en los paquetes que identifican la aplicación de origen. La clasificación se realiza examinando estas etiquetas para determinar qué aplicación generó el paquete. Aquí hay 4 formas comunes de clasificarlos. (1) Protocolo Algunos protocolos son muy "locuaces" y su existencia provocará retrasos en el servicio. Por lo tanto, identificar y priorizar los paquetes de datos según el protocolo puede reducir los retrasos. Las aplicaciones pueden identificarlos por su tipo de éter. Por ejemplo, el protocolo AppleTalk usa 0x809B e ipx usa 0x8137. Priorizar paquetes por protocolo es una forma eficaz de controlar o bloquear los protocolos de "chat" utilizados por algunos dispositivos más antiguos. (2) Números de puerto TCP y UDP Muchas aplicaciones utilizan algunos puertos TCP o UDP para la comunicación, por ejemplo, para realizar descargas grandes sin interrumpir las llamadas telefónicas. Para garantizar una priorización precisa, se debe identificar todo el tráfico en la red troncal. Debido a errores humanos o vandalismo, pueden surgir problemas con la priorización de datos de las terminales de las estaciones de trabajo. Los piratas informáticos marcan intencionalmente los datos comunes como de alta prioridad, robando así ancho de banda y paralizando aplicaciones comerciales críticas. A esto se le llama ataque de denegación de servicio. Al analizar todo el tráfico empresarial que ingresa a la red, los ataques de seguridad se pueden verificar y bloquear de manera oportuna antes de que causen algún daño. En un conmutador LAN, varias colas de servicio permiten priorizar los paquetes. Los servicios de mayor prioridad pueden pasar a través del conmutador sin verse afectados por los servicios de menor prioridad, lo que reduce los eventos de latencia para servicios urgentes, como voz o video. Para proporcionar prioridad, el conmutador debe tener al menos 2 colas por puerto. Si bien más colas por puerto pueden proporcionar opciones de priorización más granulares, en un entorno LAN es poco probable que se necesiten más de 4 colas por puerto. Cuando cada paquete llega al conmutador, el conmutador lo asigna a la cola correspondiente según su prioridad y luego reenvía los paquetes en cada cola. El conmutador determina la siguiente cola de servicio a través del mecanismo de cola. Hay dos tipos de colas: (1) Cola de prioridad estricta (SPQ) Este es el método de cola más simple. La cola con la prioridad más alta se sirve primero hasta que la cola está vacía, y luego se sirve la cola con la siguiente prioridad más alta, y así sucesivamente. La ventaja de este enfoque es que las operaciones de alta prioridad siempre se procesan antes que las de baja prioridad. Sin embargo, es posible que los servicios de baja prioridad queden completamente bloqueados por los servicios de alta prioridad. (2) Round robin ponderado (WRR) Este método proporciona servicios a todas las colas comerciales y asigna prioridad a las colas con mayor prioridad. En la mayoría de los casos, WRR procesará primero los servicios de alta prioridad en relación con los servicios de baja prioridad, pero cuando hay muchos servicios de alta prioridad, los servicios de baja prioridad no se bloquearán por completo. Qos puede determinar la prioridad según 802.1Q en el paquete. Suplemento: los enrutadores actuales generalmente admiten QoS. La QoS en el enrutador se puede obtener de las siguientes maneras: Garantizar la QoS en el enrutador a través de un gran ancho de banda no requiere hacer nada adicional excepto aumentar el ancho de banda de la interfaz. Dado que no existe un modelo matemático reconocido correspondiente para garantizar la comunicación de datos, este método solo puede ser A. estimación aproximada basada en valores empíricos. Este método sólo puede estimarse de forma aproximada a través de valores empíricos. Generalmente se cree que cuando la utilización del ancho de banda alcanza el 50%, la capacidad debe ampliarse para garantizar que la utilización del ancho de banda de la interfaz sea inferior al 50%. Este enfoque se implementa mediante la reserva de ancho de banda de un extremo a otro, que utiliza rsvp o protocolos similares para reservar el ancho de banda de un extremo a otro entre los nodos que se comunican en la red. Este enfoque puede garantizar la QoS, pero es demasiado caro y normalmente sólo es adecuado para redes empresariales o privadas y no se puede implementar en grandes redes públicas. 下篇: El programa de carga Step7 informa los errores 2000 y 120