문제

나는 검색을 해왔고 C#에서 어떻게 할 것인지는 찾지 못했습니다.

Google Chrome에게 갈 수 있도록 만들고 싶었습니다. 앞으로, , 새 탭을 엽니 다, 탭 닫기, 새 창을 엽니 다, 그리고 닫기 창 내 C# 응용 프로그램에서.

나는 Winamp를 사용하는 것과 비슷한 일을했다

[DllImport("user32", EntryPoint = "SendMessageA")]
private static extern int SendMessage(int Hwnd, int wMsg, int wParam, int lParam);

그리고 다른 사람들은 몇 명입니다. 그러나 나는 어떤 메시지를 보내야하는지 또는 그것을 전달할 창이나 무엇이든 어떤 창을 찾는 지 모른다.

그렇다면 누군가 C#에서 6 가지 명령을 Chrome에 어떻게 보낼 것인지 보여줄 수 있습니까? 감사해요

편집 : 좋아, 나는 투표를 받고있다. 그래서 나는 충분히 명확하지 않았거나 사람들이 내가 이것을 스스로 알아 내려고하지 않았다고 가정하고있을 것이다.

우선, 나는 전체 dllimport 물건에별로 좋지 않습니다. 나는 여전히 그것이 어떻게 작동하는지 배우고 있습니다.

몇 년 전 Winamp에서 같은 아이디어를 수행하는 방법을 찾았고 코드를보고있었습니다. C# 코드에서 노래를 건너 뛰고, 돌아가고, 일시 중지하고, Winamp를 중지 할 수 있도록했습니다. 가져 오기 시작했습니다.

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindow([MarshalAs(UnmanagedType.LPTStr)] string lpClassName, [MarshalAs(UnmanagedType.LPTStr)] string lpWindowName);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int SendMessageA(IntPtr hwnd, int wMsg, int wParam, uint lParam);
    [DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    public static extern int GetWindowText(IntPtr hwnd, string lpString, int cch);
    [DllImport("user32", EntryPoint = "FindWindowExA")]
    private static extern int FindWindowEx(int hWnd1, int hWnd2, string lpsz1, string lpsz2);
    [DllImport("user32", EntryPoint = "SendMessageA")]
    private static extern int SendMessage(int Hwnd, int wMsg, int wParam, int lParam);

그런 다음 내가 사용한 코드는이 상수를 보내는 메시지 에이 상수를 사용했습니다.

    const int WM_COMMAND = 0x111;
    const int WA_NOTHING = 0;
    const int WA_PREVTRACK = 40044;
    const int WA_PLAY = 40045;
    const int WA_PAUSE = 40046;
    const int WA_STOP = 40047;
    const int WA_NEXTTRACK = 40048;
    const int WA_VOLUMEUP = 40058;
    const int WA_VOLUMEDOWN = 40059;
    const int WINAMP_FFWD5S = 40060;
    const int WINAMP_REW5S = 40061;

나는 얻을 것이다 hwnd (메시지를 보내는 프로그램) : by :

IntPtr hwnd = FindWindow(m_windowName, null);

그런 다음 해당 프로그램에 메시지를 보낼 것입니다.

SendMessageA(hwnd, WM_COMMAND, WA_STOP, WA_NOTHING);

나는 Chrome과 매우 유사한 일을 할 것이라고 가정합니다. 그러나 나는 그 가치들 중 일부가 무엇인지 모르고, 답을 찾으려고 노력하는 것에 대해 글을 썼지 만, 나는 할 수 없었기 때문에 여기서 물었습니다. 그래서 내 질문은 다음과 같은 값을 얻는 방법입니다.

m_windowname 그리고 WM_COMMAND

그리고 다른 명령의 값은 앞으로, , 새로운 탭, 탭 닫기, 새창, 닫기 창?

도움이 되었습니까?

해결책

연구를 시작하십시오 http://dev.chromium.org/developers


편집하다: 창에 메시지를 보내는 것은 작업의 절반에 불과합니다. 창은 그 메시지에 응답하고 그에 따라 행동해야합니다. 해당 창이 메시지에 대해 알지 못하거나 전혀 신경 쓰지 않으면 창 메시지를 보내서 제어 할 기회가 없습니다.

원격 제어 WinAMP 방법에 대한 구현 세부 사항을보고 있습니다. 메시지를 보내는 것은 메시지를 수행하는 한 가지 방법 일 뿐이며 Winamp 개발자가 선택한 방식입니다. 사용중인 메시지는 특정 의미가있는 사용자 정의 메시지입니다. Winamp에게.

첫 번째 단계에서해야 할 일은 만약에 Chromium은 일종의 원격 제어와 그 메커니즘이 무엇인지 지원합니다.

다른 팁

Visual Studio의 Spy ++를 사용하여 창 이름을 쉽게 얻을 수 있으며 Ctrl+F를 누른 다음 Chrome을 찾을 수 있습니다. 나는 그것을 시도하고 얻었다

외부 창에 대한 "chrome_vistaframe". 웹 페이지가있는 실제 창은 "chrome_renderwidgethosthwnd"입니다.

WM_COMMAND가 진행되는 한 실험해야합니다. 당신은 분명히 버튼 클릭을 보내고 싶을 것입니다 (내 머리에서 상단의 wm_mousedown). 뒷면, 전방 버튼은 고유 한 창이 아니기 때문에 마우스를 시뮬레이션하여 특정 X에서 클릭하여 Y 위치를 알리면 Chrome이 수행하는 작업을 알고 있습니다. 또는 뒷면/포워드 등에 동등한 키보드 바로 가기를 보낼 수 있습니다.

내가 썼던 예는 Trillian과 Winamp와 함께 이것을합니다. C# 및 Winapi를 통해 Windows에 메시지를 보냅니다

스크립팅 언어를 사용하여 이미 이런 종류의 일을 거대하는 도구가 있습니다. Autoit은 내가 사용한 것입니다. autoit.com

좋아, 여기 내가 지금까지 얻은 것들이있다 ... 나는 내가해야 할 일을 알고있다.

여기 Spy ++의 창문이 있습니다. chrome_renderwidgethosthwnd 내 키보드에서 뒤로 버튼을 클릭했습니다. 여기에 내가 얻은 것은 다음과 같습니다.alt text

그래서 여기 내 가정이 있습니다. 그리고 나는 지금 영원히 놀고 있었는데, 나는 단지 가치.

IntPtr hWnd = FindWindow("Chrome_RenderWidgetHostHWND", null);
SendMessage(hWnd, WM_KEYDOWN, VK_BROWSER_BACK, 0);
SendMessage(hWnd, WM_KEYUP,   VK_BROWSER_BACK, 0);

이제 WM_KeyDown/UP 값 또는 VK_BROWSER_BACK/FORWAR 값을 어떻게 만들어야하는지 모르겠습니다.

const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
const int VK_BROWSER_BACK = 0x6A;
const int VK_BROWSER_FORWARD = 0x69;

내가 방금 보여준 이미지에서 얻은 후자의 두 값, 그 두 키의 스캔 코드. 그래도 내가 옳은지 모르겠습니다. 이전 두 값은 WM_Keydown 값에 대해 Google을 검색 한 후 얻은 두 값과 두 값에 대한 H100 및 H101을 사용한 사람입니다. 나는 내가 본 몇 가지 다른 임의의 아이디어를 시도했다. 나는 이것을 알아낼 수 없다.

아, 그리고 여기에 sendmessage 방법이 있습니다

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, uint lParam);

이것은 Interop 상수를위한 훌륭한 사이트입니다.

핀 보크

값을 찾는 또 다른 방법은 koders.com을 검색하고 C#을 언어로 사용하거나 WM_Keydown 또는 그 이후의 상수를 검색하는 것입니다.

Koders.com 검색

& H 값은 VB (6)에서 나온 것 같습니다. Pinvoke와 Koders는 모두 vk_browser_forward에 대한 결과를 반환합니다.

private const UInt32 WM_KEYDOWN        = 0x0100;
private const UInt32 WM_KEYUP          = 0x0101;

public const ushort VK_BROWSER_BACK = 0xA6;
public const ushort VK_BROWSER_FORWARD = 0xA7;
public const ushort VK_BROWSER_REFRESH = 0xA8;
public const ushort VK_BROWSER_STOP = 0xA9;
public const ushort VK_BROWSER_SEARCH = 0xAA;
public const ushort VK_BROWSER_FAVORITES = 0xAB;
public const ushort VK_BROWSER_HOME = 0xAC;

(VK_*가 1 바이트 0-255 값이라는 점을 고려할 때 VK 상수의 잘못된 정의가 얼마나 많이 떠오르는지는 재밌습니다.

당신의 구성원과 약간 다르게 보입니다. 가상 키이기 때문에 당신이 후에 당신의 기능이 sendInput이라고 생각합니다 (그러나 시도하지 않았습니다).

[DllImport("User32.dll")]
private static extern uint SendInput(uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] KEYBOARD_INPUT[] input, int structSize);

매개 변수에 대한 설명 :

매개 변수

  • Ninputs- Pinputs 배열의 구조 수.
  • PINPUTS- 입력 구조 배열에 대한 포인터. 각 구조는 키보드 또는 마우스 입력 스트림에 삽입 될 이벤트를 나타냅니다.
  • CBSIZE- 입력 구조의 크기를 바이트로 지정합니다. cbsize가 입력 구조의 크기가 아닌 경우 함수가 실패합니다.

keyboard_input 유형이 필요합니다.

[StructLayout(LayoutKind.Sequential)] 
public struct KEYBOARD_INPUT
{ 
    public uint type; 
    public ushort vk; 
    public ushort scanCode; 
    public uint flags; 
    public uint time; 
    public uint extrainfo; 
    public uint padding1; 
    public uint padding2; 
}

그리고 마지막으로 작동하는지 테스트하지 않은 샘플.

/*
typedef struct tagKEYBDINPUT {
    WORD wVk;
    WORD wScan;
    DWORD dwFlags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT;
*/
public static void sendKey(int scanCode, bool press)
{
        KEYBOARD_INPUT[] input = new KEYBOARD_INPUT[1];
        input[0] = new KEYBOARD_INPUT();
        input[0].type = INPUT_KEYBOARD;
        input[0].vk = VK_BROWSER_BACK;

    uint result = SendInput(1, input, Marshal.SizeOf(input[0]));
}

또한 크롬 창을 사용하여 초점을 맞춰야합니다 setforegroundwindow

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top