es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se utiliza PostMessage con la librería windows-rs?

Soy nuevo en Rust y en la API de Windows y estoy tratando de utilizar la función PostMessage usando el crate windows-rs. Sin embargo, no estoy seguro de qué tipo de datos espera WPARAM. He intentado adivinar ya que la documentación de windows-rs no parece decirlo. Los documentos oficiales de Microsoft para C++ parecen esperar las constantes que se encuentran a continuación… pero obtengo un error cuando intento usarlas con el crate de Rust.

https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

https://microsoft.github.io/windows-docs-rs/doc/windows/Win32/UI/WindowsAndMessaging/fn.PostMessageA.html

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-postmessagea

use windows::{
    Win32::System::Threading::{}, Win32::UI::WindowsAndMessaging::{}, Win32::UI::Input::KeyboardAndMouse::*
};

fn main() {
    unsafe {
        Sleep(1000);
        let wh = GetActiveWindow();
        PostMessageA(wh, WM_KEYDOWN, VK_ADD, None);
    }
}

Recibo un error que me indica que WPARAM no tiene una implementación para “VIRTUAL_KEY”. También he intentado usar el hexadecimal para VK_ADD de varias formas… pero cada una genera errores acerca de que WPARAM no implementa el tipo que intento usar.

PostMessageA(wh, WM_KEYDOWN, 0x6B, None);
PostMessageA(wh, WM_KEYDOWN, "0x6B", None);
let hex: u32 = 0x6B;
PostMessageA(wh, WM_KEYDOWN, hex, None);

Tampoco estoy seguro de cómo enviar el hexadecimal correctamente formateado, así que probablemente lo esté haciendo incorrectamente. ¿Alguien tiene alguna idea, o alguien con un mejor entendimiento de Rust podría revisar el código fuente del crate?

https://github.com/microsoft/windows-rs

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que WPARAM en la biblioteca windows-rs espera un valor entero. Puedes utilizar las constantes enumeradas en la documentación de Microsoft como enteros directamente, sin ningún prefijo o comillas. Por lo tanto, en tu ejemplo, puedes utilizar lo siguiente:

    unsafe {
        Sleep(1000);
        let wh = GetActiveWindow();
        PostMessageA(wh, WM_KEYDOWN, VK_ADD as WPARAM, None);
    }
    

    Alternativamente, puedes definir tus propias constantes con valores enteros basados en la documentación de Microsoft, de la siguiente manera:

    const VK_ADD: u32 = 0x6B;
    
    unsafe {
        Sleep(1000);
        let wh = GetActiveWindow();
        PostMessageA(wh, WM_KEYDOWN, VK_ADD as WPARAM, None);
    }
    

    En cuanto al envío de un valor hexadecimal, puedes agregar el prefijo “0x” y convertirlo a un entero. Así que si tienes un valor hexadecimal de 0xabc, puedes hacer lo siguiente:

    let hex_val = 0xabc;
    let int_val = hex_val as WPARAM;
    

    ¡Espero que esto te ayude! Si necesitas más ayuda, puedes consultar la documentación de la biblioteca windows-rs o pedir ayuda en el servidor de Rust en Discord.

Comments are closed.