где взять аргументы функции Win32 API CallWindowProc ()? - PullRequest
0 голосов
/ 08 марта 2011

Согласно моему исследованию, когда я запускаю исполняемый файл C #, который открывает WinForm, в .NET, они не предлагают функцию доступа к этим объектам WinForm из отдельного процесса c # (я имею в виду отдельный файл), но Win32 API делает.

Затем я наткнулся на 3 функции из API.

FindWindow();
GetWindowLong();
CallWindowProc()

Мне нужно вызвать его сверху вниз, но затем я застрял на CallWIndowProc(), потому что не могу понять, что ядолжен передать последние 3 аргумента.

private static extern UIntPtr CallWindowProc(IntPtr a, IntPtr b, uint c, IntPtr d, IntPtr e);

c, d and e

Согласно документу, это должно быть какое-то "сообщение", которое является int.Но где взять такое значение ???

http://msdn.microsoft.com/en-us/library/ms633571(v=vs.85).aspx

Код:

 [DllImportAttribute("User32.dll")]
 private static extern IntPtr FindWindow(String ClassName, String WindowName);
 [DllImportAttribute("User32.dll")]
 private static extern long GetWindowLong(IntPtr a, int b);
 [DllImportAttribute("User32.dll")]
 private static extern UIntPtr CallWindowProc(IntPtr a, IntPtr b, uint c, IntPtr d, IntPtr e);

 [STAThread]
 static void Main(string[] args)
 {
    IntPtr lResult;
    uint lMsg = 0;
    IntPtr HWND = FindWindow("WindowsFormsApplication1.Form1", "Form1");
    int GWL_WNDPROC = -4;
    long WNDPROC = GetWindowLong(HWND, GWL_WNDPROC);
    lResult = CallWindowProc(WNDPROC, HWND, lMsg, 0, 0);
 }

Разъяснение

ОК. Я должен был прояснить это. Моя цель - запустить следующий фрагмент кода против выполняемой WebForm.(Я хочу)

var t = new Thread(() =>
{
  Settings.AutoStartDialogWatcher = false;
  var ie = new IE(form1.webBrowser1.ActiveXInstance);
  ie.GoTo("http://www.google.com");
  ie.TextField(Find.ByClass("lst")).TypeText("this is awesome!!");
  ie.Button(Find.ByName("btnG")).Click();
});
t.SetApartmentState(ApartmentState.STA);
t.Start();

Ответы [ 3 ]

2 голосов
/ 08 марта 2011

Похоже, вы пытаетесь вызвать процедуру окна окна из другого потока / процесса.Я предполагаю это, потому что вы используете FindWindow, и я не вижу, где вы создали окно.Если это то, что вы делаете, CallWindowProc не будет работать, потому что вы не можете вызывать процесс окна из потока, отличного от того, который создал окно.Вам нужен SendMessage, который принимает те же последние четыре параметра (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) - чтобы интерпретировать их, вам нужно знать, какое сообщение вы отправляете.

2 голосов
/ 08 марта 2011

Какое сообщение вы пытаетесь отправить на callWinProc?

Аргументы:

nProc - это значение, возвращенное ранее SubClassWindow () (Source Window).

hWnd - дескриптор окна, которое было разделено на подклассы (целевое окно).

nMsg - это сообщение (одно из значений WM_ *, определенных в WINDOWS.CH, в основном тип события или сообщения, например щелчок, - это одно сообщение).Полные системные сообщения см. http://msdn.microsoft.com/en-us/library/ms644927(v=vs.85).aspx#system_defined

wParam зависит от nMsg.Для щелчка требуется левый или правый щелчок

lПарам зависит от nMsg.для щелчка он принимает местоположение как lparam

, вы можете увидеть определение wparam и lparam для каждого сообщения.

1 голос
/ 08 марта 2011

Я рекомендую использовать имена параметров из нативного метода просто для ясности. Вы можете получить эти подписи pinvoke от pinvoke.net , так что вам не придется делать это все время самостоятельно. Эти сообщения определены в заголовочных файлах и задокументированы в msdn. Если вы новичок в win32 и / или C #, очень трудно правильно использовать правильное сообщение.

Если вы хотите перехватить сообщения Windows в вашей форме, вам нужен обработчик сообщений Windows, но это не работает в .Net. Вы также можете прочитать эту статью , которая освещает эту тему.

Возможно, вам следует попытаться найти совершенно другое решение для вашей проблемы. Другие методы IPC и т. Д.

РЕДАКТИРОВАТЬ: тип CLR вашей формы (WindowsFormsApplication1.Form1) не является именем класса, которое вы должны поместить в FindWindow, FindWindow - неуправляемый API и не знает о системе типов CLR. Попробуйте Spy ++, чтобы исследовать некоторые окна на вашем компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...