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:
- ¿Qué esperas que se enseñe en este curso?
- ¿A qué te comprometes en este curso?
- ¿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
- Pulsa aquí o escanea el qr
- Resuelve

Actividad de aprendizaje
Instrucciones
- En la barra de búsqueda de su navegador teclea la palabra: frexus.
- De los resultados que se muestre, pulse en la opción que dice: Generando valor agregado.
- Luego pulse sobre la opción que dice academia.
- Posteriormente, Busque el nombre de la materia.
- 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
yDispatchMessage
.
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
yWM_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
- Pulsa aquí o escanea el qr
- 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