use win_auto_utils::process::{InitFlags, Process, ProcessConfig};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Process Initialization Flags Example ===\n");
println!("Note: This example requires a running target process.\n");
println!("1. Default initialization (PID + HWND + HANDLE + HDC):");
println!(" Use case: Full access to process resources");
let config = ProcessConfig::builder("notepad.exe").build();
let mut process = Process::new(config);
match process.init() {
Ok(_) => {
println!(" ✓ PID: {:?}", process.pid());
println!(" ✓ HWND: {:?}", process.hwnd());
println!(" ✓ HANDLE: {:?}", process.handle());
println!(" ✓ HDC: {:?}", process.hdc());
}
Err(e) => println!(" ✗ Failed: {} (start notepad.exe to test)", e),
}
process.cleanup()?;
println!("\n2. Minimal initialization (PID only):");
println!(" Use case: Process identification without additional resources");
let config = ProcessConfig::builder("notepad.exe")
.init_flags(InitFlags::minimal())
.build();
let mut process = Process::new(config);
match process.init() {
Ok(_) => {
println!(" ✓ PID: {:?}", process.pid());
println!(" ✗ HWND: {:?} (not initialized)", process.hwnd());
println!(" ✗ HANDLE: {:?} (not initialized)", process.handle());
println!(" ✗ HDC: {:?} (not initialized)", process.hdc());
}
Err(e) => println!(" ✗ Failed: {} (start notepad.exe to test)", e),
}
process.cleanup()?;
println!("\n3. Memory-only initialization (PID + HANDLE):");
println!(" Use case: Memory read/write operations without GUI interaction");
let config = ProcessConfig::builder("notepad.exe")
.init_flags(InitFlags::memory_only())
.build();
let mut process = Process::new(config);
match process.init() {
Ok(_) => {
println!(" ✓ PID: {:?}", process.pid());
println!(" ✗ HWND: {:?} (not initialized)", process.hwnd());
println!(" ✓ HANDLE: {:?}", process.handle());
println!(" ✗ HDC: {:?} (not initialized)", process.hdc());
}
Err(e) => println!(" ✗ Failed: {} (start notepad.exe to test)", e),
}
process.cleanup()?;
println!("\n4. GUI-only initialization (PID + HWND + HDC):");
println!(" Use case: Screen capture or GUI automation without memory access");
let config = ProcessConfig::builder("notepad.exe")
.init_flags(InitFlags::gui_only())
.build();
let mut process = Process::new(config);
match process.init() {
Ok(_) => {
println!(" ✓ PID: {:?}", process.pid());
println!(" ✓ HWND: {:?}", process.hwnd());
println!(" ✗ HANDLE: {:?} (not initialized)", process.handle());
println!(" ✓ HDC: {:?}", process.hdc());
}
Err(e) => println!(" ✗ Failed: {} (start notepad.exe to test)", e),
}
process.cleanup()?;
println!("\n5. Custom initialization flags:");
println!(" Use case: Skip specific resources based on your needs");
let custom_flags = InitFlags::new()
.with_pid(true)
.with_hwnd(true)
.with_handle(false) .with_dc(false);
let config = ProcessConfig::builder("notepad.exe")
.init_flags(custom_flags)
.build();
let mut process = Process::new(config);
match process.init() {
Ok(_) => {
println!(" ✓ PID: {:?}", process.pid());
println!(" ✓ HWND: {:?}", process.hwnd());
println!(" ✗ HANDLE: {:?} (disabled by flags)", process.handle());
println!(" ✗ HDC: {:?} (disabled by flags)", process.hdc());
}
Err(e) => println!(" ✗ Failed: {} (start notepad.exe to test)", e),
}
process.cleanup()?;
println!("\n=== Summary ===");
println!("Use InitFlags to control resource initialization:");
println!(" - InitFlags::new() : All resources (default)");
println!(" - InitFlags::minimal() : Only PID (process identification)");
println!(" - InitFlags::memory_only(): PID + HANDLE (for memory operations)");
println!(" - InitFlags::gui_only() : PID + HWND + HDC (for screen capture)");
println!(" - Custom flags : Fine-grained control with builder pattern");
Ok(())
}