2014-05-20 2 views
-1

내가 프로그램을 만들고 있었다 그리고 난이 functiong sendMessage 첨부가 게임 창에 키 입력을 시뮬레이션해야하지만 나는이 기능을 사용하는 방법을 이해하지 않습니다 "게임"에및 SendMessage C++

#include <Windows.h> 
#include <iostream> 

int main() 
{ 
     HWND hWnd = FindWindow(NULL,"Game"); 
     HWND edit = FindWindowEx(hWnd, NULL, "Edit", NULL); 
     SendMessage(edit, WM_CHAR, (TCHAR) 'H', 0); 
     SendMessage(edit, WM_CHAR, (TCHAR) 'L', 0); 
     SendMessage(edit, WM_CHAR, (TCHAR) 'O', 0); 
} 

을 및 "편집"이 오류가 있습니다 :

Error: l'argomento di tipo "const char *" è incompatibile con il parametro di tipo "LPCWSTR" 
+0

오류 메시지가 :'유형 "CONST의 char *"의 인수가' – ElGavilan

답변

4

그래서 유니 코드로 응용 프로그램을 컴파일하는 것이 분명합니다. 이를 염두에두고 :

"Edit"은 16 비트 WIDE 문자열이 아니며, 유니 코드로 컴파일 할 때은 8 비트 NARROW 문자열이고, CreateWindow은 WIDE 문자열을 필요로합니다. 대신 TEXT("Edit") 또는 L"Edit"을 사용하십시오. "Game"과 동일합니다.

+0

죄송합니다 "LPCWSTR"유형의 매개 변수와 호환되지 않습니다 ,하지만 그것을 사용하는 방법을 이해하지 못해, 코드 예제를 줄 수 있을까? –

+0

@terzi_matte 그는 단지 당신에게 보여주었습니다 ... – ElGavilan

0

구성 등록 정보 -> 일반 프로젝트 등록 정보의 "문자 세트"에 "유니 코드 문자 세트 사용"이 있습니다. 그래서 문자가있는 다이얼을 가진 거의 모든 WinAPI 함수의 이름 끝에 W가 붙습니다. 그래서 당신은 여러 가지 방법으로이 문제를 해결할 수 있습니다

  1. 변경 문자 ("게임"tchar.h 헤더 파일을 추가
  2. 사용 FindWindowA 및 FindWindowExA 및 SendMessageW 대신
  3. 설정 멀티 바이트 문자를 사용 _T를 사용하도록 설정) 등 매크로
+0

'_T ("Game") 대신'TEXT ("Game")'을 사용하십시오. 'TEXT()'매크로는 Win32 API에 속하며'TCHAR'와 함께 사용됩니다. '_T()'매크로는 C 런타임에 속하며'_TCHAR'와 함께 사용됩니다. –

+0

@RemyLebeau, 예, 밑줄이있는 이름은 C/C++ 확장입니다. 그러나 예를 들어 _TCHAR은 TCHAR이 아니 었습니다. _UNICODE에 따라 다르지만 UNICODE와 _UNICODE는 항상 함께 정의됩니다. 그렇지 않은 경우 - 코드에 매우 나쁜 점이 있습니다. 그러나 일반적으로 당신이 옳습니다. 감사 – grisha

0

그것에 대해 LPCWSTR 프로젝트 (UNICODE_UNICODE는 전처리 단계에서 정의되고있다)를 활성화 유니 코드로 컴파일되고있는 것을 의미 불평 있다는 사실에. 즉 FindWindow(Ex)()TCHAR 버전 대신 LPSTR (char*) 매개 변수를 기대 FindWindow(Ex)A()의, LPWSTR (wchar_t*) 매개 변수를 기대 FindWindow(Ex)W()에 매핑하는 것을 의미합니다.

"Edit"은 임의의 지정자가없는 문자열 리터럴이므로 컴파일러에서 const char[]으로 해석합니다. char[]char*으로 저하 될 수 있지만 wchar_t*이 예상되는 곳을 통과 할 수 없습니다. 그래서 당신은 오류가 발생합니다.

그래서 당신은 몇 가지 선택이 있습니다 프로젝트 설정에서

  1. 비활성화 유니 코드를, 당신이 보여준 코드는 그대로 컴파일됩니다.

  2. 기능 TCHAR 버전을 사용하여, 당신이 그들을 유니 코드 사용 여부에 따라 const wchar_t[] 또는 const char[]로 해석 될 수 있도록하기 위해 TEXT() 매크로 리터럴을 포장해야합니다

    HWND hWnd = FindWindow(NULL, TEXT("Game")); 
    HWND edit = FindWindowEx(hWnd, NULL, TEXT("Edit"), NULL); 
    
  3. 정지가 TCHAR를 사용하여 버전은 모두 FindWindow(Ex)()입니다.대신 직접 FindWindow(Ex)A() 또는 FindWindow(Ex)W()를 사용하여 영어

    HWND hWnd = FindWindowA(NULL, "Game"); 
    HWND edit = FindWindowExA(hWnd, NULL, "Edit", NULL); 
    

    HWND hWnd = FindWindowW(NULL, L"Game"); 
    HWND edit = FindWindowExW(hWnd, NULL, L"Edit", NULL);