Je voudrais récupérer les coordonnées de la souris (lorsqu'elle et en mouvement) hors fenêtres sur tout l'écran peu importe sa position, ainsi je me suis tourné vers les hook
Je voudrais juste récupérer les coordonnées et les écrire dans un fichier texte. Mais voilà, je n'y arrive pas même avec le proto de la fonction: HHOOK WINAPI SetWindowsHookEx( _In_ int idHook, _In_ HOOKPROC lpfn, _In_ HINSTANCE hMod, _In_ DWORD dwThreadId );
Oui désolé mais ca fait plusieurs mois que je suis sur ce problème (pas de hook mais ils en font partie)
Du coup, j'ai continu mes recherches et j'ai trouvé un code sur internet, je l'ai un peu modifier pour qu'il s'adapte. Le problème c'est qu'il est sous Virtual studio express (IDE que je n'ai jamais utilisé)
Et je voudrais juste pouvoir écrire dans un fichier texte les coordonnées de la souris (+ lParam.pt.x + ";" + lParam.pt.y), sans les boutons qui ne m'intéresse pas
Je cherche encore mais je n'arrive pas à faire une fonction si basique su code Block qu'est celle d'écrire. Pourtan je pensais qu'entre deux logiciel il n'y aller pas avoir autant de différence
Mais voilà le code:
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;
namespace HookMouse
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//mettre en place un hook
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, int dwThreadId);
//supprimer un hook mis en place
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern int UnhookWindowsHookEx(int idHook);
//permet de ne pas bloquer la chaine d'execution des hooks
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern int CallNextHookEx(int idHook, int nCode, int wParam, ref MouseLLHookStruct lParam);
private delegate int HookProc(int nCode, int wParam, MouseLLHookStruct lParam);
private HookProc MouseHookProcedure; //variable globale pour éviter le ramasse miettes
[StructLayout(LayoutKind.Sequential)]
private class POINT
{
/// <summary>
/// Coordonnée X.
/// </summary>
public int x;
/// <summary>
/// Coordonnée Y.
/// </summary>
public int y;
}
[StructLayout(LayoutKind.Sequential)]
private class MouseHookStruct
{
/// <summary>
/// Structure POINT pour les coordonnée
/// </summary>
public POINT pt;
/// <summary>
/// Handle de la window
/// </summary>
public int hwnd;
/// <summary>
/// Specifies the hit-test value. For a list of hit-test values, see the description of the WM_NCHITTEST message.
/// </summary>
public int wHitTestCode;
/// <summary>
/// Specifies extra information associated with the message.
/// </summary>
public int dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
private class MouseLLHookStruct
{
/// <summary>
/// Structure POINT.
/// </summary>
public POINT pt;
public int mouseData;
public int flags;
public int time;
public int dwExtraInfo;
}
private const int WH_MOUSE_LL = 14;
private const int WM_MOUSEMOVE = 0x200;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_MBUTTONDOWN = 0x207;
//fonction de rappel que Windows utilisera pour nous envoyer des informations
private int MouseHookProc(int nCode, int wParam, MouseLLHookStruct lParam)
{
if ((nCode >= 0)) { //nCode ne doit pas être inférieur à 0, sinon c'est qu'il y a un souci
switch (wParam) {
case WM_LBUTTONDOWN:
listBox1.Items.Add("Click gauche");
break;
case WM_RBUTTONDOWN:
listBox1.Items.Add("Click droit");
break;
case WM_MBUTTONDOWN:
listBox1.Items.Add("Click milieu");
break;
}
label1.Text = "Position: " + lParam.pt.x + ";" + lParam.pt.y;
//tant que la souris bouge (donc tant que cette procédure est appelée) on redémarre le timer
timer1.Stop();
timer1.Start();
}
return CallNextHookEx(0, nCode, wParam, ref lParam);
//façon standard de retour des HookProc
}
public void StartMouseHook()
{
// Faire une instance de HookProc.
MouseHookProcedure = new HookProc(MouseHookProc);
//installer le hook
int hook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, Process.GetCurrentProcess().MainModule.BaseAddress, 0);
// GC.KeepAlive(MouseHookProcedure)
//Si hook est a 0, donc la fonction SetWindowsHookEx a échoué
if (hook == 0) {
//Retourne le code d'erreur
int errorCode = Marshal.GetLastWin32Error();
//Lance une exception du type Win32
throw new Win32Exception(errorCode);
}
}
private void Form1_Load(System.Object sender, System.EventArgs e)
{
StartMouseHook();
}
}
}
Je l'aurais préférer sous code Block, mais c'est déjà une chance d'avoir un exemple pareil !
Voilà pour la partie écriture mais le compilateur sort une erreur de syntaxe ";"
private void label1_Click(object sender, EventArgs e)
{
Dim file As New StreamWriter("c:\test.txt");
file.WriteLine(label1.Text);
file.Close();
}
Super, j'ai essayer de mon coté, mais pas grand chose non plus. J'ai réussi a écrire dans un fichier sous l'autre langage (c#)
Merci beaucoup !!
Du coup, pour le moment je vais m'en satisfaire
Par contre, une fois que j'ai les coordonnées de ma souris dans un fichier txt (enfin plutôt 2 pour x et y ) je fait les lis (cette fois sous Code Block) et je voudrais que ma fenêtre MainWindow (sous APi Win) se déplace avec elle
J'ai teste mais il faut que je reste dans la fenêtre. IL y a pas un moyen d'obliger mon programme à lire ces deux fichiers et ensuite d'actualiser sa position avec ces dernières ? (sans utiliser de Timer, je sais pas vraiment m'en servir) ?
Si je comprends bien, tu veux que ta fenêtre suive la souris? Pas besoin de passer par un fichier, remplace la ligne 25 par un MoveWindow (mais fait du hwnd ligne 53 une variable globale?) en calculant la position de ta fenêtre en fonction des coordonnées de la souris?
Il doit y avoir une fonction similaire sous qt j'imagine?
Sinon je ne sais pas ce que tu fais comme programme mais c'est un peu bizarre ce que tu veux faire...
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
Et effectivement j'ai passé hwnd en variable globale
Pour te répondre je voudrais réaliser un programme pour les mal voyants: je veux mettre une image png (si j'y arrive) sur cette fenêtre pour qu'elle suive la souris
Par hasard, j'ai regardé sur internet mais tu ne connais pas un moyen pour supprimer la bordure d'une fenêtre sous api win ?
(Ca existe deja et c'est intégré dans windows: c'est le programme magnify/loupe: menu démarrer, programmes / accessoires /options d'ergonomie / loupe (%windir%\system32\magnify.exe))
Et il y a même une api: http://msdn.microsoft.com/en-us/library/windows/desktop/ms692402%28v=vs.85%29.aspx
edit: pour supprimer la bordure, en C toujours par contre, pour l'api win32: https://social.msdn.microsoft.com/Forums/vstudio/en-US/b98c4c06-9581-44d3-8e5a-4adb2316e653/win32-about-styles-how-can-i-do-a-borderless-window?forum=vclanguage
- Edité par breizhbugs 23 décembre 2014 à 11:19:05
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
Un exemple de code avec l'api: https://code.msdn.microsoft.com/windowsdesktop/Magnification-API-Sample-14269fd2/sourcecode?fileId=42827&pathId=1612434249 (oubli pas de linker le bon fichier .lib)
La version windowed fait une sorte de négatif des couelurs pour améliorer le contraste!) (bien qu'un peu longue a démarrer elle marche plutot bien et semble relativement simple...)
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
Ps: Je suis aller voir pour la bordure mais SetWindowLong(hwnd, WS_BORDER, NULL); ne semble pas fonctionner
Le mieux est de régler correctement le createwindow, pour le setwindowlong, il faut utiliser une autre fonction ensuite pour demander le rafraichissement de la fenêtre je crois! EDIT: lu trop vite! c'est pas comme cela qu'on utilise: il faut d'abord récupérer le style d'une fenetre, lui enlever le style WS_BORDER et reaffecter le nouveau style via setwindowlong:
Pour faire de skyrim une full screen borderless windows par exemple: j'ai utilisé ce bout de code:
dwStyle = GetWindowLongPtr( hwnd, GWL_STYLE); // on récupère le style actuel
dwStyle = dwStyle & ~(WS_CAPTION | WS_BORDER); // on enlève la zone de titre et les bordures
SetWindowLongPtr( hwnd, GWL_STYLE, dwStyle); // on remet le style modifié
if (SetWindowPos(hwnd, HWND_TOP, 0, 0, 1920, 1080, SWP_NOZORDER|SWP_FRAMECHANGED) == 0) //on réactualise la fenêtre en indiquant ce qui a été modifié - le cadre ici
Error( "SetWindowPos");
(mais si c'est toi qui créer la fenêtre, autant la créer comme il faut dans le createwindowex!)
- Edité par breizhbugs 23 décembre 2014 à 12:09:01
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
Par contre, il reste toujours une bordure mais pas la" barre de gestion" du dessus
Aussi, je sais qu'il faut créer un autre sujet, mais je pense que ca devrait être rapide (Jai du louper un truc super évident): je voudrais juste insérer une image dans ma fenêtre sans passer par des ressources
Du coups, je prend une fonction généraliste:
void afficheBitmap(HWND fenetreCiblee, char *chemin)
{
HBITMAP bitmap;
HDC hDC;
//Chargement du bitmap
hDC=GetDC(fenetreCiblee);
//Affichage du bitmap
DeleteObject(bitmap);
ReleaseDC(fenetreCiblee,hDC);
}
Et pour l'appel de ma fonction je n'ai pas d'erreur de compil mais un avertissement: deprecated conversion from string constant to 'char*' [-Wwrite-strings] et un avertissement a cette ligne: DrawState(hDC,NULL,NULL,(LPARAM)hBmp,NULL,0,0,0,0,DST_BITMAP);
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.