2015-11-25 2 views
0

Привет Я использую visual C++ У меня есть рабочая программа EXCEPT, для чего-то, что я хочу, чтобы она могла использовать отдельную программу скриншотов. У меня есть отдельная программа для скриншотов, в которой у программы есть зарегистрированная горячая клавиша, чтобы сделать снимок экрана, я хочу, чтобы моя программа это сделала.Имитировать глобальную горячую клавишу

Я пробовал keybd_event и SendInput с FindWindow, и он отлично работает с записью, но программа скриншотов работает с минимальными или скрытыми, и я знаю о проблеме с SetForegroundWindow.

Есть ли способ сделать это похожим на систему Windows Я просто нажал на клавиатуру для всех окон, таких как настоящая горячая клавиша? Программа скриншотов отлично работает с реальной горячей клавишей.

ответ

1

Может быть, клавиатурный крючок решит проблему?

Не совершенным, но они довольно глобальный

+0

Хорошо, я могу узнать о крючке, но может ли это нажимать клавишу или просто слушать? У другой программы есть горячая клавиша, я хочу, чтобы моя программа нажала ее. – pomodo01

+0

Кажется, я понял. Вы хотите имитировать нажатие клавиши, чтобы внешняя программа делала скриншот, не так ли? Ну, это не горячая клавиша, с которой у вас проблемы. Кстати, обратите внимание на следующее: * Принимая sreenshot из собственного кода довольно легко * Вы можете объединить собственную горячую клавишу с каким-то вызовом трубы к упомянутой программе Но в любом случае, решение, что вы хотите прямо сейчас [SendInput()] (https://batchloaf.wordpress.com/2012/04/17/simulating-a-keystroke-in-win32-c-or-c-using-sendinput). Да, вы пробовали это, но что-то должно работать, если это правильно реализовано. – MasterAler

0

enter image description here

Вот исходный код для глобальной горячей клавиши. Он был установлен для прослушивания CTRL + y сочетание клавиш. Однажды CTRL + y запускается, он захватывает скриншот.

Чтобы закрыть глобальную горячую клавишу, просто нажмите CTRL + д.

Чтобы скрыть окно консоли и сохранить горячую клавишу работает в фоновом режиме нажмите CTRL + ж.

#define _WIN32_WINNT 0x0400 
#pragma comment(lib, "user32.lib") 

#include <iostream> 
#include <windows.h> 
#include <stdio.h> 

HHOOK hKeyboardHook; 
__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam); 
void MessageLoop(); 
DWORD WINAPI my_HotKey(LPVOID lpParm); 
int toggleVisibility = 1; 

int screenResolutionX = GetSystemMetrics(SM_CXSCREEN); 
int screenResolutionY = GetSystemMetrics(SM_CYSCREEN); 
POINT startCoord,endCoord; 
void grabScreenshot(POINT a, POINT b); 

/********************************************* 
***          *** 
***          *** 
**********************************************/ 


int main(int argc, char** argv){ 

    /* uncomment to hide console window */ 
    //ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false); 

    HANDLE hThread; 
    DWORD dwThread; 

    printf("\n s c r e e n s h o t H O T K E Y \n\n"); 
    printf("press CTRL-y for screenshot \n"); 
    printf("press CTRL-w to hide or make console window visible \n"); 
    printf("press CTRL-q to quit \n"); 
    printf("\n\n"); 

    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) my_HotKey, (LPVOID) argv[0], NULL, &dwThread); 

    if (hThread) return WaitForSingleObject(hThread,INFINITE); 
    else return 1; 

} 

/********************************************* 
***          *** 
***          *** 
**********************************************/ 


__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam){ 
    DWORD SHIFT_key=0; 
    DWORD CTRL_key=0; 
    DWORD ALT_key=0; 


    if ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN))) { 
     KBDLLHOOKSTRUCT hooked_key = *((KBDLLHOOKSTRUCT*)lParam); 
     DWORD dwMsg = 1; 
     dwMsg += hooked_key.scanCode << 16; 
     dwMsg += hooked_key.flags << 24; 
     char lpszKeyName[1024] = {0}; 

     int i = GetKeyNameText(dwMsg, (lpszKeyName+1),0xFF) + 1; 

     int key = hooked_key.vkCode; 

     SHIFT_key = GetAsyncKeyState(VK_SHIFT); 
     CTRL_key = GetAsyncKeyState(VK_CONTROL); 
     ALT_key = GetAsyncKeyState(VK_MENU); 

     //printf("%c",key); 

     if ((key >= 'A') && (key <= 'Z') || (key >= 'a') && (key <= 'z') || (key >= '0') && (key <= '9')) { 

      if (GetAsyncKeyState(VK_SHIFT)>= 0) key +=32; 

      /********************************************* 
      *** Hotkey scope       *** 
      *** do stuff here      *** 
      **********************************************/ 

      if ((CTRL_key !=0) && (key == 'y') || (key == 'Y')) { 

       CTRL_key=0; 

       // grab a screenshot 

       startCoord.x=0; 
       startCoord.y=0; 

       endCoord.x=screenResolutionX; 
       endCoord.y=screenResolutionY; 

       ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false); 
       Sleep(1000); 
       grabScreenshot(startCoord,endCoord); 

       ShowWindow(FindWindowA("ConsoleWindowClass", NULL), true); 

       printf("\nThe Screenshot is in the Clipboard \n\n"); 
      } 

      //****************************************************** 

      if ((CTRL_key !=0) && (key == 'q') || (key == 'Q')) { 
       MessageBox(NULL, "\n\n\n\nShutting down\n\nPress OK to close\n\n", "          H O T K E Y           ", MB_OK); 
       PostQuitMessage(0); 
      } 

      //****************************************************** 

      if ((CTRL_key !=0) && (key == 'w') || (key == 'W')) { 

       toggleVisibility = - toggleVisibility; 

       if (toggleVisibility >0) { 
        ShowWindow(FindWindowA("ConsoleWindowClass", NULL), true); 
       } 
       else{ 
        ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false); 
       } 
      } 

      SHIFT_key = 0;CTRL_key = 0; ALT_key = 0; 
     } 
    } 
    return CallNextHookEx(hKeyboardHook, nCode,wParam,lParam); 
} 


/********************************************* 
***          *** 
***          *** 
**********************************************/ 

void MessageLoop(){ 

    MSG message; 
    while (GetMessage(&message,NULL,0,0)){ 
     TranslateMessage(&message); 
     DispatchMessage(&message); 
    } 
} 

/********************************************* 
***          *** 
***          *** 
**********************************************/ 


DWORD WINAPI my_HotKey(LPVOID lpParm){ 
    HINSTANCE hInstance = GetModuleHandle(NULL); 
    if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm); 
    if (!hInstance) return 1; 

    hKeyboardHook = SetWindowsHookEx ( WH_KEYBOARD_LL, (HOOKPROC) KeyboardEvent, hInstance, NULL ); 
    MessageLoop(); 
    UnhookWindowsHookEx(hKeyboardHook); 
    return 0; 
} 


/********************************************* 
***          *** 
***          *** 
**********************************************/ 


void grabScreenshot(POINT a, POINT b){ 

    // copy screen to bitmap 
    HDC  hScreen = GetDC(NULL); 
    HDC  hDC  = CreateCompatibleDC(hScreen); 
    HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, abs(b.x-a.x), abs(b.y-a.y)); 
    HGDIOBJ old_obj = SelectObject(hDC, hBitmap); 
    BOOL bRet = BitBlt(hDC, 0, 0, abs(b.x-a.x), abs(b.y-a.y), hScreen, a.x, a.y, SRCCOPY); 

    // save bitmap to clipboard 
    OpenClipboard(NULL); 
    EmptyClipboard(); 
    SetClipboardData(CF_BITMAP, hBitmap); 
    CloseClipboard(); 

    // clean up 
    SelectObject(hDC, old_obj); 
    DeleteDC(hDC); 
    ReleaseDC(NULL, hScreen); 
    DeleteObject(hBitmap); 
} 
Смежные вопросы