2008-09-29 46 views
19

Tôi đã tìm kiếm xung quanh và tôi không tìm thấy cách tôi sẽ thực hiện việc này từ C#.C# - Gửi tin nhắn tới Google Chrome từ ứng dụng C#

Tôi đã muốn làm cho nó để tôi có thể yêu cầu Google Chrome để đi Chuyển, Trở lại, mở New Tab, Close Tab, mở cửa sổ mớiĐóng cửa sổ từ của tôi Ứng dụng C#.

tôi đã làm một cái gì đó tương tự với WinAmp sử dụng

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

và một vài người khác. Nhưng tôi không biết phải gửi thông điệp gì hoặc làm thế nào để tìm ra cửa sổ nào để chuyển nó đến, hoặc bất cứ thứ gì.

Vậy ai đó có thể chỉ cho tôi cách tôi gửi 6 lệnh đó đến Chrome từ C#? cảm ơn

EDIT: Ok, tôi bị bỏ phiếu, vì vậy có thể tôi chưa đủ rõ ràng hoặc mọi người cho rằng tôi không cố gắng tự mình tìm ra điều này.

Trước hết, tôi không thực sự tốt với toàn bộ công cụ DllImport. Tôi vẫn đang học cách nó hoạt động.

Tôi đã tìm cách thực hiện ý tưởng tương tự trong winamp một vài năm trước và tôi đã xem mã của mình. Tôi đã làm cho nó để tôi có thể bỏ qua một bài hát, quay lại, chơi, tạm dừng và dừng winamp từ mã C# của tôi. Tôi bắt đầu bằng cách nhập:

[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); 

Sau đó, mã tôi đã sử dụng để sử dụng các hằng số này cho thư tôi gửi.

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; 

tôi sẽ nhận được hwnd (chương trình để gửi tin nhắn đến) bằng cách:

IntPtr hwnd = FindWindow(m_windowName, null); 

sau đó tôi sẽ gửi một thông điệp tới chương trình:

SendMessageA(hwnd, WM_COMMAND, WA_STOP, WA_NOTHING); 

tôi giả sử rằng tôi sẽ làm một cái gì đó rất giống với điều này cho Google Chrome. nhưng tôi không biết một số giá trị đó nên là gì, và tôi googled xung quanh cố gắng tìm câu trả lời, nhưng tôi không thể, đó là lý do tại sao tôi hỏi ở đây. Vì vậy, câu hỏi của tôi là làm thế nào để tôi nhận được các giá trị cho:

m_windowNameWM_COMMAND

và sau đó, các giá trị cho các lệnh khác nhau, mong, lại, tab mới, đóng tab, cửa sổ mới, đóng cửa sổ?

Trả lời

9

Bắt đầu nghiên cứu của bạn tại http://dev.chromium.org/developers


EDIT: Việc gửi thư tới một cửa sổ chỉ là một nửa của tác phẩm. Cửa sổ phải trả lời tin nhắn đó và hành động tương ứng. Nếu cửa sổ đó không biết về một tin nhắn hoặc không quan tâm, bạn không có cơ hội để kiểm soát nó bằng cách gửi tin nhắn cửa sổ.

Bạn đang xem chi tiết triển khai về cách bạn điều khiển từ xa Winamp. Gửi tin nhắn chỉ là một cách để làm điều đó và đó là cách các nhà phát triển Winamp chọn. Những thư bạn đang sử dụng là thư do người dùng xác định có ý nghĩa cụ thể chỉ để Winamp.

Điều bạn phải làm trong bước đầu tiên là tìm hiểu nếu Chromium hỗ trợ một số loại điều khiển từ xa và cơ chế đó là gì.

+0

Tôi đang xem xét, và tôi không thấy bất cứ điều gì sẽ giúp tôi hoàn thành những gì tôi đang cố gắng làm. Tôi không muốn biên dịch lại Chrome hay bất cứ thứ gì. Tôi chỉ muốn gửi cho Chrome một thông điệp nhỏ nói "quay lại" hoặc bất cứ điều gì. Tôi không muốn thay đổi Chrome chút nào. Làm tất cả từ C# – Joel

7

Bạn có thể lấy tên cửa sổ dễ dàng bằng Spy ++ của Visual Studio và nhấn CTRL + F, sau đó tìm chrome. Tôi đã thử và nhận được

"Chrome_VistaFrame" cho cửa sổ mở. Cửa sổ thực tế với trang web là "Chrome_RenderWidgetHostHWND".

Theo như WM_COMMAND đi - bạn sẽ cần phải thử nghiệm. Bạn rõ ràng sẽ muốn gửi các nút bấm (WM_MOUSEDOWN của đầu ra khỏi đầu của tôi). Khi mặt sau, các nút chuyển tiếp không phải là cửa sổ riêng của chúng, bạn sẽ cần phải tìm ra cách làm điều này bằng cách mô phỏng một cú click chuột tại một vị trí x, y nào đó để chrome biết bạn đang làm gì. Hoặc bạn có thể gửi phím tắt tương đương cho phím quay lại/tiến và vv.

Một ví dụ tôi đã viết một trong khi trước đây thực hiện điều này với Trillian và winamp: sending messages to windows via c# and winapi

Ngoài ra còn có công cụ hiện có để vĩ mô ra loại điều đã có, sử dụng một ngôn ngữ kịch bản - AutoIt là một trong Tôi đã sử dụng: autoit.com

+0

Vì vậy, tôi đã chơi với điều này trong một hoặc hai giờ. Tôi muốn gửi các phím tắt. Hiện tại tôi đang cố gắng tìm cách gửi cho Chrome tin nhắn cho WM_KEYDOWN và WM_KEYUP cho khóa VK_BROWSER_BACK. Nhưng tôi không thể tìm ra giá trị int cho chúng. – Joel

4

Ok, đây là những gì tôi đã có cho đến nay ... tôi kinda biết những gì tôi cần phải làm, nhưng nó chỉ là một vấn đề làm việc đó bây giờ ...

đây là cửa sổ từ Spy ++, tôi bị khóa vào Chrome_RenderWidgetHostHWND và nhấp vào nút Quay lại trên bàn phím của tôi. Đây là những gì tôi nhận: alt text

Vì vậy, đây là giả thiết của tôi, và tôi đã chơi với điều này mãi mãi bây giờ, tôi chỉ không thể tìm ra các giá trị .

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

Bây giờ, tôi chỉ không biết những gì tôi nên làm cho WM_KEYDOWN/UP giá trị hoặc các giá trị VK_BROWSER_BACK/Forward ... Tôi cố gắng này:

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

Sau đó hai giá trị tôi có được từ hình ảnh tôi vừa trình bày, ScanCodes cho hai khóa đó. Tôi không biết nếu tôi đã làm nó mặc dù. Hai giá trị cũ tôi nhận được sau khi tìm kiếm google cho giá trị WM_KEYDOWN và một người đã sử dụng & H100 và & H101 cho hai giá trị. Tôi đã thử một số ý tưởng ngẫu nhiên khác mà tôi đã nhìn thấy xung quanh. Tôi không thể hình dung ra điều này.

Oh, và đây là phương pháp SendMessage

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

Đây là một trang web tuyệt vời cho hằng interop:

pinvoke

Một cách khác để tìm kiếm các giá trị là để tìm kiếm koders.com, sử dụng C# làm ngôn ngữ, cho WM_KEYDOWN hoặc hằng số bạn đang theo sau:

Koders.com search

& Giá trị H giống như từ VB (6). pinvoke và koders cả trả lại kết quả cho 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; 

(Thật buồn cười bao nhiêu defintions sai hằng VK đang nổi về, xem xét VK_ * là 1 byte 0-255 giá trị, và mọi người đã làm cho họ uints).

Có vẻ hơi khác so với các chòm sao của bạn. Tôi nghĩ rằng các chức năng bạn đang sau là SendInput (nhưng tôi đã không thử nó) vì nó là một chìa khóa ảo.

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

Giải thích về các thông số:

thông số

  • nInputs- Số cấu trúc trong mảng pInputs.
  • pInputs - Con trỏ tới một mảng cấu trúc INPUT. Mỗi cấu trúc đại diện cho một sự kiện được chèn vào dòng đầu vào bàn phím hoặc chuột.
  • cbSize - Chỉ định kích thước theo byte, của cấu trúc INPUT. Nếu cbSize không phải là kích thước của một cấu trúc INPUT, hàm sẽ thất bại.

này cần một loại 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; 
} 

Và cuối cùng là một mẫu, mà tôi đã không kiểm tra nếu nó hoạt động:

/* 
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])); 
} 

Ngoài ra, bạn sẽ cần phải tập trung vào Chrome cửa sổ bằng cách sử dụng SetForegroundWindow

Các vấn đề liên quan