Giter Club home page Giter Club logo

Comments (10)

AArnott avatar AArnott commented on July 19, 2024 1

We use structs for each unique handle type to give added type safety, similar to that enjoyed by C developers. HWND as a parameter type immediately gives an idea on its content and where you might come by a value to fit, whereas IntPtr tells nearly nothing.

Our structs that serve as IntPtr substitutes are implicitly convertable to IntPtr, so you can use them without casts anywhere that an IntPtr is expected.
You can also explicitly cast any IntPtr to one of these structs, making it nearly as convenient to go the other way as well.

from cswin32.

AArnott avatar AArnott commented on July 19, 2024 1

Yes, you can cast them. If Process APIs use IntPtr instead of handle struct types, can you please file a bug at https://github.com/microsoft/win32metadata/issues giving specific APIs as examples?

from cswin32.

AArnott avatar AArnott commented on July 19, 2024 1

I'm sorry for misdirecting you.
.NET has a convention that we use implicit conversion operators for lossy or base type conversions, and explicit conversion operators for derived types. In this case every HWND is an IntPtr, but not every IntPtr is an HWND. This is why we have the HWND conversion operators set up like this:

public static implicit operator nint(HWND value) => value.Value;
public static explicit operator HWND(nint value) => new HWND(value);

Note that nint is equivalent to IntPtr for our purposes here (although it actually should be an IntPtr... that's a regression #312).

from cswin32.

jnm2 avatar jnm2 commented on July 19, 2024 1

@michael-hawker Did you mean the regression Andrew mentioned as already being tracked at #312?

from cswin32.

Micke3rd avatar Micke3rd commented on July 19, 2024

I understand, thank you.

from cswin32.

michael-hawker avatar michael-hawker commented on July 19, 2024

@AArnott is this documented somewhere? You get an IntPtr from the Process APIs, so it's not clear compared to the old manual way of doing PInvoke how to pass those into the generated methods (e.g. SetForegroundWindow).

It sounds like you can just do:

     PInvoke.SetForegroundWindow((HWD)process.MainWindowHandle);

from cswin32.

jnm2 avatar jnm2 commented on July 19, 2024

If Process APIs use IntPtr instead of handle struct types, can you please file a bug at https://github.com/microsoft/win32metadata/issues giving specific APIs as examples?

I believe his example was showing the BCL Process API https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.mainwindowhandle.

from cswin32.

michael-hawker avatar michael-hawker commented on July 19, 2024

Thanks @AArnott, should we re-open this issue for tracking the regression then?

from cswin32.

AArnott avatar AArnott commented on July 19, 2024

@michael-hawker What is the regression? Per my last comment, the behavior of requiring an explicit cast to "upgrade" an IntPtr to an HWND is by design with strong precedent in the .NET community. And it's also by design that the metadata and generated code use HWND as a more concrete type than IntPtr.

from cswin32.

michael-hawker avatar michael-hawker commented on July 19, 2024

@michael-hawker Did you mean the regression Andrew mentioned as already being tracked at #312?

Yup, sorry. Didn't connect the dots that that issue was tracking the regression itself.

from cswin32.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.