Dr, Alfredo de Jesús Gutiérrez Gómez
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?
Unidad 1. Conceptos básicos de Windows.
Unidad 2. API win32 y controles gráficos.
Unidad 3: MFC
Unidad 4: Programación de dispositivos.
Unidad 5: Programación del shell.
Unidad 1. Conceptos básicos de Windows.
Unidad 2. API win32 y controles gráficos.
Unidad 3. MFC
Unidad 4. Programación de dispositivos.
Unidad 4. Programación del shell.
El incumplimiento de las tareas en tiempo y forma llevarán a una no aprobación del curso.
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.
En una hoja escribe la respuesta a la siguiente pregunta:
Una vez contestadas las preguntas anteriores escribir en el foro respectivo la respuesta a cada pregunta.
Se enumeran las recomendaciones que se deben seguir para la realización de las actividades
Trabajos
Párrafos
Ortografía
Referencia bibliográfica
Lista de referencias bibliográfica
Introducción y conclusión
Formato del trabajo
Tablas
Imágenes / diagramas / gráficas
Conceptos básicos de Windows.
La arquitectura de Windows está dividida en varias capas
Componentes principales:
Las aplicaciones tienen acceso restringido al hardware. Los fallos no afectan el sistema operativo.
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 de Windows
Win32 API
Es la más utilizada, proporcionando acceso a recursos como ventanas, archivos y redes.
Identificador para recursos del sistema.
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.
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.
DLL (Dynamic Link Libraries)
Ejemplo
user32.dll
maneja funciones de interfaz de usuario.
Herramienta de automatización y scripting.
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.
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
Instrucciones
Instrucciones
API win32 y controles gráficos
GetMessage
, TranslateMessage
y DispatchMessage
.MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
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))
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.
WM_LBUTTONDOWN
, WM_RBUTTONUP
, etc.WM_KEYDOWN
y WM_KEYUP
.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")
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
.
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)
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.
import win32api
import win32gui
win32api.MessageBox(0, "Hola desde Python", "Mensaje", 1)
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.
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.
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
.
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)
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
.
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
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.
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.
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
.
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
.
Instrucciones