Programación para Windows

Dr, Alfredo de Jesús Gutiérrez Gómez

Contenido

1.  Piense en el nombre de un animal que inicie con la primera letra de su nombre.

2. Este no deberá repetirse.

3. Al presentarse deberá completar la siguiente frase: Mi nombre es: _______ y he venido sobre un/a: _______ a la escuela desde _____

4. Dar respuesta a las preguntas:

4.1  ¿Porqué estudio está carrera?

4.2  ¿Qué me ha gustado de la carrera hasta ahora?

Presentación

Unidad 1. Conceptos básicos de Windows.

  • Arquitectura del sistema.
  • Modos de usuario y del kernel.
  • API
  • Tipos de datos.
  • Codificaciones de caracteres.
  • Bibliotecas de enlace dinámico (dll).
  • Herramientas oss.
  • scripts.

Temas

Temas

Unidad 2. API win32 y controles gráficos.

  • Mensajes.
  • Interfases (ratón, teclado y mensajes).
  • Creación de ventanas.
  • Controles para la interfaz de usuario.
  • Entrada y salida.
  • Administración de archivos.
  • Subsistema de memoria.
  • Multitarea.
  • Intercomunicación de procesos.
  • mdi.
  • API del registro.
  • Seguridad del api.
  • Winsock.

Temas

Unidad 3: MFC

  • Introducción al mfc.
  • Herencia.
  • Com y activex.
  • Dcom y com+.
  • Mezclado de lenguajes.
  • OLE

Temas

Unidad 4: Programación de dispositivos.

  • El DDK.
  • Estructura de un driver.
  • Api de un driver.
  • TSR, VXD, WDM

Temas

Unidad 5: Programación del shell.

  • Extensiones.
  • Salvapantallas.
  • Servicios.
  • CMD.
  • Applets del panel .

Unidad 1. Conceptos básicos de Windows.

  • Cuestionario de conocimiento.
  • Caso de estudio

Actividades a evaluar

Unidad 2. API win32 y controles gráficos.

  • Cuestionario de conocimiento.
  • Caso de estudio

Unidad 3. MFC

  • Cuestionario de conocimiento.
  • Estudio de Caso

Actividades a evaluar

Unidad 4. Programación de dispositivos.

  • Cuestionario de conocimiento.
  • Estudio de caso.

Unidad 4. Programación del shell.

  • Cuestionario de conocimiento.
  • Caso de estudio

Actividades a evaluar

  • Teléfono móvil en modo silencio.
  • Las llamadas urgentes /prio se contestan fuera del salón.
  • Turnos de una sola persona para ir al WC.
  • Dos faltas a la semana sin justificante perderían derecho a las cuestiones de aprendizaje.
  • Levantar la mano para participar.
  • Respetar la participación de cada alumno.
  • No hay retardos.

Políticas de clase

  • Mantenerse informado acerca de las lecturas, actividades y tareas del curso asistiendo por lo menos dos veces por semana, durante la duración del curso.
  • Cumplir dentro del aula virtual con todas las tareas, foros y actividades detalladas por el programa académico y el profesor, en el tiempo y forma establecidos.
  • El incumplimiento de las tareas en tiempo y forma llevarán a una no aprobación del curso.

Lineamientos de clase

  • Realizar el seguimiento personal desde el Aula Virtual.

  • Estar pendiente de los resultados de las evaluacion/es parcial/es y final/es.

  • Notificar al tutor por escrito, con copia a la coordinación académica, si, por alguna razón excepcional, se encontrara en una circunstancia especial que le impidiera continuar con el curso y recibir así indicaciones de cómo proceder a partir de ese momento.

Lineamientos de clase

En una hoja escribe la respuesta a la siguiente pregunta:

 

  1. ¿Qué esperas que se enseñe en este curso?
  2. ¿A qué te comprometes en este curso?
  3. ¿Qué deseas aprender en este curso?

 

Una vez contestadas las preguntas anteriores escribir en el foro respectivo la respuesta a cada pregunta.

Actividad de encuadre

Recomendaciones

Se enumeran las recomendaciones que se deben seguir para la realización de las actividades

  • Portada
  • Presentación
  • Introducción
  • Conclusión

Recomendaciones para:

Trabajos

  • Mayores a tres líneas
  • Menores a ocho líneas
  • Coherencia entre párrafos

Párrafos

  • Acentuación en mayúsculas y minúsculas.
  • Evitar redundancia.
  • Evitar pleonasmos.
  • Mínimo tres errores.

Recomendaciones para:

Ortografía

  • Al menos tres citas dentro del trabajo.
  • En formato APA 7ma edición.

Referencia bibliográfica

  • Al menos tres fuentes de diversos autores.
  • Con sangría francesa al inicio de cuatro espacios.
  • Fuente Times New Roman.
  • 12 puntos.
  • Sin enlaces activos.

Recomendaciones para:

Lista de referencias bibliográfica

  • Mínimo tres párrafos

Introducción y conclusión

  • Fuente Arial.
  • Tamaño de título: 14 puntos.
  • Tamaño de texto: 12 puntos.
  • Interlineado 1.5
  • Alineación justificada del texto.
  • Los títulos alineados a la izquierda.
  • En el encabezado del documento colocar el logotipo del instituto alineado a la derecha. Nombre de la carrera a la izquierda.

Recomendaciones para:

Formato del trabajo

  • Colocarle al pie de la tabla un nombre a la tabla, bajo el siguiente formato:  <nombre_tabla numero consecutivo>. <nombre_tabla> <fuente:> <donde_fue_tomada> .
  • Colocar un párrafo descriptivo

Recomendaciones para:

Tablas

  • Colocarle al pie de la tabla un nombre a la tabla, bajo el siguiente formato:  <nombre_tabla numero consecutivo>. <nombre_tabla> <fuente:> <donde_fue_tomada> .
  • Colocar un párrafo descriptivo

Recomendaciones para:

Imágenes / diagramas / gráficas

¿Dudas?

Unidad I

Conceptos básicos de Windows.

  • Microsoft Windows es un sistema operativo ampliamente utilizado en entornos personales y empresariales.
  • Su diseño se basa en la interacción de varias capas que permiten la comunicación entre hardware, software y usuarios.

Conceptos básicos de Windows.

La arquitectura de Windows está dividida en varias capas

  • Capa de hardware: Interactúa con dispositivos físicos.
  • Kernel: El núcleo del sistema, que maneja la comunicación con el hardware y los procesos.
  • Modo de usuario: Donde se ejecutan aplicaciones y servicios sin acceso directo al hardware.
  • Subsystems: Entornos para aplicaciones como Win32 y POSIX.

Arquitectura del Sistema

Componentes principales:

  • Executive: Maneja procesos, memoria y seguridad.
  • Microkernel: Coordina los hilos y la multitarea.
  • HAL (Hardware Abstraction Layer): Interfaz entre hardware y software

Arquitectura del Sistema

Las aplicaciones tienen acceso restringido al hardware. Los fallos no afectan el sistema operativo.

Modos de Usuario y del Kernel

Modo Usuario

Modo Kernel

Procesos con acceso total al hardware. Aquí operan los controladores y el kernel. Los errores en modo kernel pueden causar fallos graves.

Son conjuntos de funciones que permiten a las aplicaciones interactuar con el sistema operativo.

API (Application Programming Interface)

API de Windows

Win32 API

Es la más utilizada, proporcionando acceso a recursos como ventanas, archivos y redes.

Identificador para recursos del sistema.

Tipos de Datos

HANDLE

DWORD

Entero sin signo de 32 bits.

Los tipos de datos comunes en Windows son definidos por su API

LPSTR y LPWSTR

Punteros a cadenas de caracteres ASCII y Unicode, respectivamente

Codificación básica para texto.

Codificaciones de Caracteres

ASCII

Windows soporta diferentes codificaciones:

Unicode (UTF-16)

Codificación predeterminada para representar caracteres multilingües.

Contienen funciones que se cargan durante la ejecución para compartir código entre aplicaciones.

Bibliotecas de Enlace Dinámico (DLL)

DLL (Dynamic Link Libraries)

Ejemplo

user32.dll maneja funciones de interfaz de usuario.

Herramienta de automatización y scripting.

Herramientas OSS (Open Source Software)

PowerShell

Notepad++

Editor de texto avanzado.

Existen herramientas de código abierto compatibles con Windows​

Notepad++

WSL (Windows Subsystem for Linux)

Permite ejecutar un entorno Linux.

Secuencias de comandos ejecutadas en CMD.

Scripts

Batch (.bat)

PowerShell (.ps1)

Más potente que Batch, permite acceso completo a las API de Windows.

Los scripts en Windows son utilizados para automatizar tareas

Actividad de aprendizaje

Instrucciones

  1. Pulsa aquí o escanea el qr
  2. Resuelve

Actividad de aprendizaje

Instrucciones

  1. En la barra de búsqueda de su navegador teclea la palabra: frexus.
  2. De los resultados que se muestre, pulse en la opción que dice: Generando valor agregado.
  3. Luego pulse sobre la opción que dice academia.
  4. Posteriormente, Busque el nombre de la materia.
  5. Identifica la título Actividad, lee el recurso: Caso de estudio Unidad 1 y resuelve las preguntas de reflexión.

 

API win32 y controles gráficos

Unidad II

  • La arquitectura de mensajes de la API de Win32 permite que las aplicaciones respondan a eventos como clics del ratón o presiones de teclas.
  • Los mensajes se manejan a través de un bucle de mensajes que utiliza GetMessage, TranslateMessage y DispatchMessage.

Mensajes

Mensajes

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

Mensajes

import ctypes
from ctypes import wintypes

user32 = ctypes.windll.user32

msg = wintypes.MSG()
while user32.GetMessageW(ctypes.byref(msg), None, 0, 0) != 0:
    user32.TranslateMessage(ctypes.byref(msg))
    user32.DispatchMessageW(ctypes.byref(msg))

Interfaces (Ratón y Teclado)

case WM_LBUTTONDOWN:
    MessageBox(hwnd, "Se hizo clic con el botón izquierdo", "Mensaje", MB_OK);
    break;

Las interfaces de entrada permiten manejar dispositivos como teclado y ratón.

  • Ratón: Los mensajes incluyen WM_LBUTTONDOWN, WM_RBUTTONUP, etc.
  • Teclado: Se manejan con mensajes como WM_KEYDOWN y WM_KEYUP.

Interfaces (Ratón y Teclado)

import win32api
import win32con

x, y = win32api.GetCursorPos()
print(f"Posición del cursor: {x}, {y}")

# Detectar si se presionó el botón izquierdo del ratón
if win32api.GetAsyncKeyState(win32con.VK_LBUTTON):
    print("Botón izquierdo del ratón presionado")

Creación de Ventanas

HWND hwnd = CreateWindowEx(
    0,                      // Estilo extendido
    "ClaseVentana",         // Nombre de la clase
    "Título de la Ventana", // Título
    WS_OVERLAPPEDWINDOW,    // Estilo
    CW_USEDEFAULT, CW_USEDEFAULT, 500, 400, // Posición y tamaño
    NULL, NULL, hInstance, NULL
);

Se usa la función CreateWindow o CreateWindowEx.

Creación de Ventanas

import win32gui

def wnd_proc(hwnd, msg, wparam, lparam):
    if msg == 0x0010:  # WM_CLOSE
        win32gui.PostQuitMessage(0)
    return 0

wc = win32gui.WNDCLASS()
wc.lpfnWndProc = wnd_proc
wc.lpszClassName = "MiVentanaPython"
win32gui.RegisterClass(wc)
hwnd = win32gui.CreateWindow(wc.lpszClassName, "Ventana Python", 0xCF0000, 100, 100, 300, 200, 0, 0, 0, None)
win32gui.ShowWindow(hwnd, 1)
win32gui.UpdateWindow(hwnd)

Controles para la Interfaz de Usuario

HWND hButton = CreateWindow(
    "BUTTON", "OK",
    WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
    50, 50, 100, 30,
    hwnd, (HMENU)ID_OK, hInstance, NULL
);

Los controles como botones, cajas de texto y listas se crean usando funciones específicas.

Controles para la Interfaz de Usuario

import win32api
import win32gui

win32api.MessageBox(0, "Hola desde Python", "Mensaje", 1)

Entrada y Salida

HDC hdc = GetDC(hwnd);
TextOut(hdc, 10, 10, "Hola, Win32", 11);
ReleaseDC(hwnd, hdc);

La entrada se maneja con eventos de teclado o ratón; la salida se hace mediante GDI (Graphics Device Interface) para dibujar gráficos.

Entrada y Salida

import ctypes
ctypes.windll.user32.MessageBoxW(0, "Texto de ejemplo", "Título", 1)

La entrada se maneja con eventos de teclado o ratón; la salida se hace mediante GDI (Graphics Device Interface) para dibujar gráficos.

Administración de Archivos

HANDLE hFile = CreateFile("ejemplo.txt", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD written;
WriteFile(hFile, "Texto de ejemplo", 15, &written, NULL);
CloseHandle(hFile);

La API proporciona funciones como CreateFile, ReadFile, y WriteFile.

Administración de Archivos

import win32file

file = win32file.CreateFile("ejemplo.txt", win32file.GENERIC_WRITE, 0, None, win32file.CREATE_NEW, 0, None)
win32file.WriteFile(file, b"Contenido del archivo")
win32file.CloseHandle(file)

Subsistema de Memoria

import ctypes

# Reserva un bloque de memoria de 100 bytes
size = 100
memory_block = ctypes.create_string_buffer(size)

# Escribir datos en la memoria
data = b"Hola, este es un ejemplo"
ctypes.memmove(memory_block, data, len(data))

# Leer datos de la memoria
print("Contenido de la memoria:", memory_block.raw.decode('utf-8'))

# Manipular valores específicos
memory_block[10] = ord('X')  # Cambiar el carácter en la posición 10
print("Memoria modificada:", memory_block.raw.decode('utf-8'))

# Liberar memoria: En Python, la gestión es automática, pero para simulación:
ctypes.cast(memory_block, ctypes.POINTER(ctypes.c_void_p))  # Solo como demostración

Se manejan bloques de memoria usando funciones como GlobalAlloc, HeapAlloc, o VirtualAlloc.

Multitarea

import threading

def funcion_hilo():
    print("Hilo en ejecución")

hilo = threading.Thread(target=funcion_hilo)
hilo.start()

Python utiliza la librería threading para manejar hilos

Intercomunicación de Procesos (IPC)

from multiprocessing import Process, Pipe

def proceso_hijo(conn):
    # Recibir un mensaje del proceso principal
    mensaje = conn.recv()
    print(f"Mensaje recibido del proceso principal: {mensaje}")
    # Enviar una respuesta
    conn.send("¡Mensaje recibido, proceso principal!")
    conn.close()

if __name__ == "__main__":
    # Crear un pipe (conexión entre dos procesos)
    conn_padre, conn_hijo = Pipe()
    
    # Crear y arrancar el proceso hijo
    proceso = Process(target=proceso_hijo, args=(conn_hijo,))
    proceso.start()
    
    # Enviar un mensaje al proceso hijo
    conn_padre.send("Hola, proceso hijo")
    
    # Recibir respuesta del proceso hijo
    respuesta = conn_padre.recv()
    print(f"Respuesta del proceso hijo: {respuesta}")
    
    # Esperar a que el proceso hijo termine
    proceso.join()

Se puede usar multiprocessing o socket para comunicación.

MDI(Multiple Document Interface)

from PyQt5.QtWidgets import QApplication, QMainWindow, QMdiArea, QMdiSubWindow, QTextEdit, QAction
import sys

class MDIExample(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        # Crear un área MDI
        self.mdi = QMdiArea()
        self.setCentralWidget(self.mdi)

        # Crear acciones para abrir nuevas ventanas
        new_action = QAction("Nueva Ventana", self)
        new_action.triggered.connect(self.create_new_window)

        # Barra de menú
        menu_bar = self.menuBar()
        file_menu = menu_bar.addMenu("Archivo")
        file_menu.addAction(new_action)

        # Configuración de la ventana principal
        self.setWindowTitle("Ejemplo de MDI en PyQt5")
        self.setGeometry(100, 100, 800, 600)
        self.show()

    def create_new_window(self):
        # Crear una subventana dentro del área MDI
        sub_window = QMdiSubWindow()
        text_edit = QTextEdit()
        sub_window.setWidget(text_edit)
        sub_window.setWindowTitle("Nueva Ventana de Documento")
        self.mdi.addSubWindow(sub_window)
        sub_window.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mdi_example = MDIExample()
    sys.exit(app.exec_())

Permite crear aplicaciones con múltiples documentos dentro de una ventana principal.

API del Registro

import win32api

clave = win32api.RegOpenKeyEx(win32api.HKEY_CURRENT_USER, "Software\\Microsoft", 0, win32api.KEY_READ)
valor, tipo = win32api.RegQueryValueEx(clave, "NombreDelValor")
print(valor)
win32api.RegCloseKey(clave)

Permite leer y escribir en el registro de Windows con funciones como RegOpenKeyEx y RegSetValueEx.

Seguridad

import win32security
import ntsecuritycon as con

def set_file_permissions(file_path):
    # Obtener el descriptor de seguridad del archivo
    sd = win32security.GetFileSecurity(file_path, win32security.DACL_SECURITY_INFORMATION)

    # Crear una nueva DACL (Lista Discrecional de Control de Acceso)
    dacl = win32security.ACL()

    # Obtener el SID (Security Identifier) del usuario actual
    user_sid, _, _ = win32security.LookupAccountName(None, win32security.GetUserName())

    # Agregar una entrada de control de acceso para permitir lectura y escritura
    dacl.AddAccessAllowedAce(win32security.ACL_REVISION, con.FILE_GENERIC_READ | con.FILE_GENERIC_WRITE, user_sid)

    # Establecer la nueva DACL en el descriptor de seguridad
    sd.SetSecurityDescriptorDacl(1, dacl, 0)
    win32security.SetFileSecurity(file_path, win32security.DACL_SECURITY_INFORMATION, sd)
    print(f"Permisos de lectura y escritura asignados a {file_path} para el usuario actual.")

if __name__ == "__main__":
    archivo = "ejemplo.txt"  # Asegúrate de que este archivo existe
    set_file_permissions(archivo)

Se maneja mediante ACLs (Access Control Lists) y funciones como SetSecurityInfo.

Actividad de aprendizaje

Instrucciones

  1. Pulsa aquí o escanea el qr
  2. Resuelve

Programación para Windows

By Alfredo de Jesús Gutiérrez Gómez

Programación para Windows

presentación donde se desarrolla la materia programación para windows

  • 103