2017-03-20 5 views
1

파랑 색을 감지하는 프로그램을 만들고 화면의 좌표에 따라 마우스를 움직이거나 클릭합니다.시스템 명령을 사용하는 동안 SendInput이 작동하지 않습니다.

감지가 제대로 작동하지만 "system ("osk ")"줄의 가상 키보드를 추가 할 때 문제가 발생했습니다.

활성 창이 가상 키보드 인 경우 프로그램이 백그라운드에서 작동하지 않습니다. 프로그램이 실행 중이지만 마우스가 움직이거나 클릭하지 않는 것입니다. 활성 창이 가상 키보드가 아닐 때 모든 것이 올바르게 작동합니다.

내 코드에서 무엇이 잘못되었는지 알 수 있도록 도와 줄 수 있습니까?

마우스 이동 코드 :

void MouseMove(int x, int y) 
{ 
    double fScreenWidth = ::GetSystemMetrics(SM_CXSCREEN) - 1; 
    double fScreenHeight = ::GetSystemMetrics(SM_CYSCREEN) - 1; 
    double fx = 2 * x*(65535.0f/(fScreenWidth - 200)); 
    double fy = 2 * y*(65535.0f/fScreenHeight); 
    INPUT Input = { 0 }; 
    Input.type = INPUT_MOUSE; 
    Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE; 
    Input.mi.dx = (LONG)fx; 
    Input.mi.dy = (LONG)fy; 
    ::SendInput(1, &Input, sizeof(INPUT)); 
} 

을 그리고 이것은 명령 시스템 ("OSK")가있는 주요 기능입니다 :

int main() 
{ 
VideoCapture cap(0); 
if (!cap.isOpened()) 
    return -1; 

system("osk"); // <----------------------------------------- 
while (true) 
{ 
    int xMouse = 0, yMouse = 0; 
    float totalX = 0.0, totalY = 0.0; 

    Mat frame, frame2; 
    cap >> frame; 
    cvtColor(frame, frame2, COLOR_BGR2HSV); 
    Mat hsvImg = frame2; 

    inRange(hsvImg, Scalar(78, 241, 59), Scalar(255, 255, 255), hsvImg); // Blue 


    vector<vector<Point>> contours; 
    vector<Vec4i> hierarchy; 
    erode(hsvImg, hsvImg, getStructuringElement(MORPH_ELLIPSE, Size(5, 5))); 
    dilate(hsvImg, hsvImg, getStructuringElement(MORPH_ELLIPSE, Size(5, 5))); 
    dilate(hsvImg, hsvImg, getStructuringElement(MORPH_ELLIPSE, Size(5, 5))); 
    erode(hsvImg, hsvImg, getStructuringElement(MORPH_ELLIPSE, Size(5, 5))); 

    Mat drawing = Mat::zeros(frame.size(), CV_8UC3); 

    flip(drawing, drawing, 1); 
    flip(frame, frame, 1); 
    flip(hsvImg, hsvImg, 1); 

    RNG rng(12345); 
    findContours(hsvImg, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

    if (contours.size() > 0) 
    { 
     float sumX = 0.0, sumY = 0.0; 

     for (unsigned int i = 0; i < contours.size(); i++) 
     { 
      for (unsigned int j = 0; j < contours[i].size(); j++) 
      { 
       totalX += contours[i][j].x; 
       sumX++; 
       totalY += contours[i][j].y; 
       sumY++; 
      } 
     } 


     if (contours.size() == 2) 
     { 
      LeftClick(); 
      cout << contours.size() << endl << endl; 
     } 
     else if (contours.size() == 1) 
     { 
      xMouse = (int)(totalX/sumX); 
      yMouse = (int)(totalY/sumY); 
      MouseMove(xMouse, yMouse); 
     } 
     else{ 
      cout << "Too many Contours" << endl << endl; 
     } 

     for (unsigned int i = 0; i < contours.size(); i++) 
     { 
      Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); 
      drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point2f(xMouse, yMouse)); 
     } 


    } 

    imshow("Drawing", drawing); 
    imshow("Original", frame); 

    if (waitKey(30) == 'q') //Wait 30 milisec. If user pressed ‘q’ break the loop. 
     break; 
} 
waitKey(0); 
} 

감사합니다 :)

답변

0

같은 문제가있는 사람들을 위해이 문제를 해결할 수있는 방법을 찾았습니다 :)

대신 우리가 할 수 있습니다. 윈도우의 가상 키보드를 사용하여 인터넷에서 VK를 설치하면 "시스템 프로그램"으로 간주되지 않습니다 (그런 식으로 말하면). 그런 다음, 우리는 단지 우리가 코드를 설치 한 새 VK를 열어야합니다 :

ShellExecute(NULL, "open", "VK.exe", NULL, NULL, SW_SHOWDEFAULT); 

그런 다음 VK는 프로그램에서 열립니다하고 문제가 해결됩니다! :)

관련 문제