Bonjour,
Je souhaite faire un gestionnaire de presse papier en application win32.
Grace à un hook, je suis capable d'intercepter les pressions sur le clavier.
Grace à GetForegroundWindow, GetWindowThreadProcessId, GetCurrentThreadId, GetFocus et finalement SendMessage, j'arrive à simuler la copie dans le presse papier du texte sélectionné dans l'application qui est premier plan.
Seulement cela ne marche pas pour toutes les applis (notamment Netbeans ou Chrome)
Je vous colle la fonction du hook :
Code C/C++ :
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *hookstruct = ((KBDLLHOOKSTRUCT*)lParam);
BYTE KeyState[256];
WORD Char = 0;
char sKeyName[MAX_PATH] = "";
DWORD dwMsg = 1;
static int bDeadKey = 0;
static int bCapsOn;
int bCtrlOn = 0;
int bLeftShift = 0;
int bRightShift = 0;
if((nCode == HC_ACTION) && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
{
if (nCode < 0 || nCode == HC_NOREMOVE)
return CallNextHookEx(hHook, nCode, wParam, lParam);
if(IsDeadKey(hookstruct->vkCode))
{
bDeadKey = 1;
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
bCapsOn = GetKeyState(VK_CAPITAL) & 0x0001;
bCtrlOn = GetKeyState(VK_CONTROL) & 0x8000;
bLeftShift = GetKeyState(VK_LSHIFT) & 0x8000;
bRightShift = GetKeyState(VK_RSHIFT) & 0x8000;
switch(hookstruct->vkCode)
{
case VK_F9 :
HWND hwnd = GetForegroundWindow();
DWORD remoteThreadId = GetWindowThreadProcessId(hwnd, NULL);
DWORD currentThreadId = GetCurrentThreadId();
AttachThreadInput(remoteThreadId, currentThreadId, TRUE);
HWND focused = GetFocus();
AttachThreadInput(remoteThreadId, currentThreadId, FALSE);
SendMessage(focused, WM_COPY, 0, 0);
LPCSTR strFromClipboard = "";
if (OpenClipboard(NULL))
{
HANDLE hClipboardData = GetClipboardData(CF_TEXT);
char *pchData = (char*)GlobalLock(hClipboardData);
strFromClipboard = pchData;
CloseClipboard();
SetWindowText(hEdit[0],strFromClipboard);
}
break;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
Voila, merci d'avance pour votre aide =)