Overblog Suivre ce blog
Administration Créer mon blog
18 juin 2015 4 18 /06 /juin /2015 07:31

Le problème :

Le bug de Photoshop dont l'écouteur d'événements clavier ne fonctionne pas du tout m'empêche d'installer les raccourcis claviers dont j'aurais besoin en particulier pour déplacer le curseur de la souris d'un écran à l'autre.

La solution :

Le programme ci-dessous.

Il est améliorable. Tel qu'il est il fonctionne à merveille pour moi. Il faudra l'adapter à vos besoins par exemple en éditant x0, y0, x1, y1, deltaX pour les déplacements de la souris. Il se compile très bien avec Crimson sous Windows 7 64 et g++.

Les commentaires sont de mauvaise qualité car ils ont été faits avec un clavier exotique.

Copier coller tout ce qui suit dans un fichier .cpp et l'ouvrir avec l'éditeur de votre choix.

#include <iostream>

#include <string>

#include <windows.h>

#define DEBUG 1

using namespace std;

// les variables utiles pour dfinir la fenetre qui handle les resulats elle est masquee. Voir doc C++ Windows sur //Internet

#define CLASSNAME "MaFenetre"

#define WINDOWTITLE "Blabla"

char windir[MAX_PATH + 1];

HHOOK kbdhook; // pour se hooker dans le clavier

bool origine = true;

// pour le placement du curseur comme la suite : x0 et y0 positions par defaut ecran 1, x1 y1 idem ecran 2 deltaX //est la variation verticale

int x0 = 1850;

int y0 = 1100;

int x1 = 4000;

int y1 = 800;

int deltaX = 200;

// pour traitement de la string str qui connait la touche frappee.

int modificateur = 0;

// stocke le genre de touche frappee : maj, ctrl alt, F8 etc.

//intialise à 0 : touche sans modificateur

string str;

//la touche frappee on peut refaire tout le programme en travaillant directement sur les codes de touches keycodes

POINT cursor; // pour trouver la position du curseur

// On se branche dans windows. Voir la doc sur Internet : taper declspec dans google.

// on a accès à tout le clavier et le pave numerique.

__declspec(dllexport) LRESULT CALLBACK handlekeys(int code, WPARAM wp, LPARAM lp)

{

if (code==(wp == WM_SYSKEYDOWN || wp == WM_KEYDOWN)) {

char tmp[0xFF] = {0};// classique

DWORD msg = 1;

KBDLLHOOKSTRUCT st_hook = *((KBDLLHOOKSTRUCT*)lp);

bool caractere;

/* Si un caractère a plus d une lettre c est in caractere special comme la touche MAJ

* Pour les touches dont on veut se souvenir, on defint le modificateur puis on refait la fonction *__declspec

* si alors on frappe une touche elle sera frappee avec la touche MAJ enfoncee.

*/

/* on recupere la frappe sous forme d une string. Voir la doc microsoft sur Internet */

msg += (st_hook.scanCode << 16);

msg += (st_hook.flags << 24);

GetKeyNameText(msg, tmp, 0xFF);

str = string(tmp);

if (str.length() <= 1) {

caractere = true;

} else {

caractere = false;

}

// Cas plus d+un caractère

if (!caractere) {

if (str == "MAJ") {

modificateur = 1 ;

}

if (str == "CTRL") {

modificateur = 2 ;

}

if (str == "ALT"){

modificateur = 3 ;

}

if (str == "Impr.Ecran"){

exit(0);

}

}

// Cas un seul caractère

if (caractere) {

if (str == "<") {

int x;

int y;

switch(modificateur){

case 0 : {

if (origine == true){

x = x1;

y = y1;

} else {

x = x0;

y = y0;

}

origine = !origine;

break ;

}

case 1 : {

GetCursorPos(&cursor);

x = cursor.x ;

y = cursor.y - deltaX ;

break ;

}

case 2 : {

GetCursorPos(&cursor);

x = cursor.x ;

y = cursor.y + deltaX ;

break ;

}

case 3 : {

break;

}

default : {

break ;

}

}

SetCursorPos( x, y );

}

if (( str == "Q") && (modificateur == 2)) exit(0);

modificateur = 0;

}

#ifdef DEBUG

cout<<str; // cette ligne affiche la touche frappee dans la fenetre d exectution.

//Sert à debugger. C+est la seule ligne faisant appel à iostream que l on peut supprimer //pour faire l+exe final.

#endif

}

return CallNextHookEx(kbdhook, code, wp, lp);

}

/*Appelee par DispatchMessage() pour gerer les messages voir la doc microsoft sur Internet */

LRESULT CALLBACK windowprocedure(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)

{

switch (msg) {

case WM_CLOSE: case WM_DESTROY:

exit(0);

break;

default:

return DefWindowProc(hwnd, msg, wp, lp);

break;

}

return 0;

}

int WINAPI WinMain(HINSTANCE thisinstance, HINSTANCE previnstance,

LPSTR cmdline, int ncmdshow)

{

// Construction de le fenetre masquee.

// C+est tout des paramètres de la fenetre voir la doc sur Internet

HWND hwnd;

HWND fgwindow = GetForegroundWindow(); // comme son nom l+indique

MSG msg; // le message vehicule

WNDCLASSEX windowclass;

HINSTANCE modulehandle;

windowclass.hInstance = thisinstance;

windowclass.lpszClassName = CLASSNAME;

windowclass.lpfnWndProc = windowprocedure;

windowclass.style = CS_DBLCLKS;

windowclass.cbSize = sizeof(WNDCLASSEX);

windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);

windowclass.lpszMenuName = NULL;

windowclass.cbClsExtra = 0;

windowclass.cbWndExtra = 0;

windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND;

if (!(RegisterClassEx(&windowclass)))

return 1;

hwnd = CreateWindowEx(NULL, CLASSNAME, WINDOWTITLE, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, HWND_DESKTOP, NULL,

thisinstance, NULL);

if (!(hwnd))

return 1;

#ifdef DEBUG

//decommenter la ligne dessous pour voir la fenetre mère

//ShowWindow(hwnd, SW_SHOW);

#else

ShowWindow(hwnd, SW_HIDE);

#endif

UpdateWindow(hwnd);

SetForegroundWindow(fgwindow); // remet phtooshop on top

modulehandle = GetModuleHandle(NULL);

kbdhook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)handlekeys, modulehandle, NULL);

GetWindowsDirectory((LPSTR)windir, MAX_PATH);

//Boucle infinie dont on sort soit en cliquant sur la croix sot avec le raccourci ctrl et q.

for ( ;; ){

if (!GetMessage(&msg, NULL, 0, 0)) break;

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return 0;

}

Repost 0
5 juin 2015 5 05 /06 /juin /2015 15:23

Bug Photoshop CS5 une solution plus avancée.

La solution que j'ai donnée un peu plus bas ici est une solution qui peut être mise en œuvre par tout un chacun si l'on sait exécuter un programme Windows en mode administrateur.

Elle fonctionne bien mais il y en a une autre plus efficace encore pour ceux qui savent programmer en C++

Il faut d'abord écrire un écouteur de clavier en C++ qui se branche sous Windows tout en fonctionnant en arrière-plan. C'est un outil de pirate et je ne le donnerai qu'à ceux que je connais bien.

Une fois cet outil fabriqué, vous pourrez installer tous les raccourcis claviers dont vous aurez envie et ils seront valables pour toutes les applications, il suffira de les déclarer dans le code.

Repost 0
1 juin 2015 1 01 /06 /juin /2015 13:54

Comment déplacer le curseur de la souris depuis une application comme Photoshop à l'aide d'un simple raccourci clavier.

Ce qui suit fonctionne parfaitement avec Windows 7 64 et aidera à traiter le problème du bug du gestionnaire d'événements clavier de Photoshop CS5.

Le problème : Je travaille avec Photoshop sur plusieurs écrans ce qui fait que je perds souvent mon curseur et il est parfois pénible de savoir où il est. Je veux donc appuyer sur la touche F8 pour qu'il se place au milieu de mon écran principal ou sur maj F8 pour qu'il aille sur mon écran secondaire.

Photoshop a un bug qui fait que la fonctionnalité KeyboardListener ne transmet pas les frappes de touches. Il faut travailler à l'extérieur de Photoshop.

En VBS il est impossible de déplacer la souris et les batch files (.bat) ne permettent pas de simuler des frappes.

Solution :

1) Télécharger un utilitaire gratuit nircmd.exe et le placer dans C:/Windows il faut placer nircmd;exe et nircmdc.exe dans Windows.

2) Dans C:/Windows créer un fichier ecran_01.bat (fichier texte dont on change l'extension). Ecrire :

nircmd.exe setcursor 1800 1200

(éditer les nombres évidemment). Sauvegarder.

3) Clic droit sur ecran_01.bat créer un raccourci et accepter de le créer sur le bureau.

4) De retour sur le bureau, clic droit sur le raccourci et choisir l'onglet Propriétés. La fenêtre Propriétés du raccourci s'ouvre, choisir l'onglet raccourci, cliquer dans la case Touche de raccourci puis appuyer sur F8. Dans la case exécution choisir réduite. Fermer.

5) Ouvrir Photoshop et appuyer sur F8. Le curseur va bien au bon endroit mais la fenêtre Photoshop n'est pas active ce qui est très gênant pour le confort de travail.

6) Prendre un script vbs qui fonctionne. Le vider. Y écrire :

Dim objWshShell

Set objWshShell = WScript.CreateObject("WScript.Shell")

WScript.sleep(75)

objWshShell.SendKeys("%{TAB}")

Ce programme simule la frappe de touche al+tab.

7) Si ça ne marche pas, on peut écrire 500 à la place de 75. Si ça ne marche pas il faut chercher sur internet la combinaison de touches à écrire entre guillemets après SendKeys(.

Enregistrer ce fichier dans C:/Windows.

8) Clic droit sur ecran_01.bat modifier et écrire :

START «» /B « retourPremierPlan.vbs » puis enregistrer dans C:/Windows

Recommencer le même genre de chose pour maj F8 qui placera le curseur en 4000 1200. Inutile de refaire le script vbs évidemment.

Repost 0