2010-05-29 21 views
1

J'utilise un exemple de code pour me connecter à une webcam et je ne comprends pas vraiment la signification des variables passées à la méthode SendMessage.SendMessage videocapture consts

SendMessage(DeviceHandle, WM_CAP_SET_SCALE, -1, 0) 

SendMessage(DeviceHandle, WM_CAP_SET_PREVIEW, -1, 0) 

Que signifie le -1? Pour mettre à l'échelle/prévisualiser ou ne pas mettre à l'échelle/prévisualiser? Je préférerais que zéro/un soit utilisé, zéro signifie faux, et je n'ai aucune idée de ce que le -1 signifie.

SendMessage(DeviceHandle, WM_CAP_EDIT_COPY, 0, 0); 

Que signifie le zéro dans ce cas? Ou est-ce que ce message est simplement vide et le zéro n'a pas de signification, semblable au dernier argument zéro? Btw, que signifie le dernier argument zéro?

Merci beaucoup à l'avance :)

Répondre

2

Vous avez probablement trouvé un exemple de code qui a été écrit à l'origine dans Visual Basic. L'argument WParam pour SendMessage() est documenté pour être un BOOL. Ce devrait être FALSE (0) ou TRUE (1). Une particularité de VB6 est que sa valeur TRUE booléenne est -1. La raison est un peu obscure et liée au fonctionnement de ses opérateurs ET et OU.

Votre code actuel fonctionne par accident, le code Windows qui interprète le message traite simplement une valeur non nulle comme « TRUE ».

Cependant, il y a un plus gros problème, votre déclaration SendMessage() est erronée. Les arguments WParam et LParam sont probablement déclarés comme "int", une valeur de 32 bits. Sur les systèmes d'exploitation 64 bits, ils sont cependant une valeur de 64 bits. Sur un tel système d'exploitation, votre appel SendMessage() échouera gravement. Il y a aussi des chances que vous soyez déjà sur un système d'exploitation 64 bits et que ces arguments soient déclarés comme Long, comme ils ont été déclarés dans VB6. Dans ce cas, votre code échouera sur un système d'exploitation 32 bits.

La déclaration appropriée pour SendMessage:

[DllImport("user32.dll")] 
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 

Et la bonne façon d'envoyer le message:

SendMessage(DeviceHandle, WM_CAP_SET_SCALE, (IntPtr)1, IntPtr.Zero); 

qui fonctionnera correctement sur les systèmes d'exploitation 32 bits et 64 bits.

+0

Quelques déclarations plus correctes http://www.pinvoke.net/default.aspx/user32.sendmessage – abatishchev

+0

Merci beaucoup, je n'ai jamais su cela. Je vais le réparer tout de suite. – Rita

+0

Btw, y at-il un endroit où je pourrais voir d'autres surcharges, pour toute méthode externe? – Rita

0

un message WM_CAP_SET_SCALE active ou désactive le redimensionnement des images vidéo preview

un message WM_CAP_SET_PREVIEW Active ou désactive le mode d'aperçu

WM_CAP_EDIT_COPY copies de message le contenu de la vidéo frame buffer et palette associée au presse-papiers

SendMessage a la prochaine signature:

LRESULT WINAPI SendMessage(
    __in HWND hWnd, 
    __in UINT Msg, 
    __in WPARAM wParam, 
    __in LPARAM lParam 
); 

wParam et lParam - sont "des informations spécifiques message supplémentaires". Wparam signifie word et Lparam signifie long.

Ces paramètres sont facultatifs et peuvent être utilisés ou ne peuvent pas être utilisés. Donc l'un d'eux ou les deux sont utilisés si un message nécessite l'envoi de données supplémentaires.

+0

Merci pour votre réponse. J'ai vu la signature, je ne comprends pas/quoi/sont ces paramètres supplémentaires spécifiques au message. Que signifie -1 dans les messages WM_CAP_SET_SCALE/WM_CAP_SET_PREVIEW? – Rita

+0

La plupart du temps (pour autant que je l'ai vu) '-1' en C/C++ signifie 'non applicable'. Si la description du message ne contient aucune remarque sur les paramètres supplémentaires, je pense que cela signifie que ce message n'en a pas besoin. Aussi, 0 signifient 'NULL', c'est-à-dire 'param supplémentaire n'est pas envoyé' – abatishchev

+0

J'ai vu que dans la plupart des cas, 0/1 est utilisé. Je pense que dans ce cas, -1 signifie 'non zéro = vrai', alias simplement vrai. Bizarre, mais logique: S – Rita