Gagner de l'api en C#. Obtenir haut et bas mot à partir de IntPtr
Je suis en train de traiter un message WM_MOUSEMOVE en C#.
Quelle est la bonne façon d'obtenir des coordonnées X et Y de lParam qui est un type de IntPtr?
Vous devez vous connecter pour publier un commentaire.
Essayer:
(noter que c'était la version initiale, lire ci-dessous pour la version finale)
La
unchecked
normalement n'est pas nécessaire (parce que le "par défaut" les projets c# ne sont pas cochées)Considérer que ce sont les définitions des macros:
Où
WORD == ushort
,DWORD == uint
. Je vais couper quelques ushort->court de conversions.Addendum:
d'un an et demi plus tard, et ayant connu les "caprices" de 64 bits .NET, je suis d'accord avec Celess (mais notez que 99% des messages de Windows sont encore en 32 bits pour des raisons de compatibilité, donc je ne pense pas que le problème n'est pas vraiment grand maintenant. C'est plus pour l'avenir et parce que si vous voulez faire quelque chose, vous devez le faire correctement.)
La seule chose que je voudrais faire est différente en ceci:
au lieu de faire le chèque "est le
IntPtr
4 ou 8 octets de long", je prends le pire des cas (8 octets de long) et castxy
à unlong
. Avec un peu de chance, le double en fonte (àlong
puis àshort
/àuint
) sera optimisé par le compilateur (en fin de compte, la conversion explicite àint
deIntPtr
est un leurre... Si vous l'utilisez, vous vous mettez à risque dans l'avenir. Vous devriez toujours utiliser lalong
conversion et ensuite l'utiliser directement/re-fonte à ce que vous avez besoin, en montrant à l'avenir les programmeurs que vous savait ce que vous faisiez.Un exemple de test: http://ideone.com/a4oGW2 (malheureusement uniquement en 32 bits, mais si vous avez une machine 64 bits, vous pouvez tester le même code)
IntPtr
? J'ai toujours utilisé leToXXX()
membre de méthodes pour l'obtention de données dans un entier.IntPtr
àlong
parce que de passer plus de pourrait entraîner uneOverflowException
sur les ordinateurs 64 bits. 2. Sur les deux 32-bit & ordinateurs 64 bits, SEULE la plus faible valeur de 32 bits sont utilisés pour lalParam
, de sorte qu'il est sûr à baissés, sans perte d'informations. 3. Nous jette àshort
pour nous assurer de ne prendre que les 16 bits de l'intérêt. Est-ce que son correct?Corriger à la fois 32 et 64 bits:
- ou -
Ces travaux:
- ou -
Autre
- ou -
Accepté la réponse est bonne traduction de la C de la définition. Si traitent seulement la première 'void*' directement, serait alors la plupart du temps correct. Cependant lors de l'utilisation de 'IntPtr" dans un .Net 64 bits de l'environnement d'exécution, 'non cochée" ne va pas arrêter la conversion des exceptions de dépassement d'être expulsé de l'intérieur IntPtr. La décoché bloc ne pas affecter les conversions qui se produisent à l'intérieur de IntPtr funcitons et les opérateurs. Actuellement la accepté de répondre stipule que l'utilisation de "unchecked" n'est pas nécessaire. Cependant, l'utilisation de "décochées" est absolument nécessaire, comme ce serait toujours le cas dans un casting pour les valeurs négatives d'un grand type.
Sur 64-bit, de la accepté de répondre:
Sur 64 bits, en utilisant la version extrapolée de DmitryG de l':
Sur la performance
La IntPtr.La taille de la propriété renvoie une constante de temps de compilation littéral qui est capable si être insérée à travers des assemblées. Est donc possible pour l'équipe d'avoir quasi-totalité de cette optimisé à. Pourrait également le faire:
- ou -
- ou -
et tous les 3 de ces sera toujours appeler le equivalient de IntPtr.ToInt64(). ToInt64(), et " opérateur de long, sont également susceptibles d'être intégrées, mais moins susceptibles de l'être. Est beaucoup plus de code en version 32 bits que la Taille de la constante. Je dirais que la solution au dessus n'est peut-être plus symantically correcte. Il est aussi important d'être conscient de connexion extension des artefacts, ce qui permettrait de combler tous les 64-bits reguardless sur quelque chose comme (long)int_val, bien que j'ai assez bien dissimulée qu'ici, cependant, peut en outre affecter inline sur 32 bits.
Useage
Sûre IntPtr maquette indiqué ci-dessous pour les futurs traverlers.
Exécuter ce sans réglage de la WIN32 définir sur 32 bits pour obtenir une simulation solide de la 64 bits IntPtr comportements.
En général, pour les bas-niveau traitement de souris, j'ai utilisé l'assistance suivante (il estime également que IntPtr taille dépend x86/x64):
IntPtr
est une bonnePoint
il sera jamais lancer! Ainsi, le code ci-dessus est complète.