API - передать сообщение окну.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by GenTao, 15 Oct 2009.

  1. GenTao

    GenTao New Member

    Joined:
    10 Oct 2009
    Messages:
    123
    Likes Received:
    2
    Reputations:
    -3
    Допустим,есть открытое окно Notepad.Необходимо передать ему сатическую строку,к примеру,"hello".Это своего рода эмуляция ввода с клавиатуры.Смог получить только дескриптор,а дальше у меня не работало.Есть конкретные примеры ? (Желательно попроще).

    HWND s;
    s = FindWindow("Notepad","Untitled - Notepad");
     
  2. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    На ассемблере набросал, но думаю, что будет понятно.
    Code:
          .486                      ; create 32 bit code
          .model flat, stdcall      ; 32 bit memory model
          option casemap :none      ; case sensitive
    
          include \masm32\include\windows.inc
          include \masm32\include\user32.inc
          include \masm32\include\kernel32.inc
          include \masm32\macros\macros.asm
    
          includelib \masm32\lib\user32.lib
          includelib \masm32\lib\kernel32.lib
    
    .code
    
    start:
    invoke FindWindow,chr$("Notepad"),chr$("Untitled - Notepad")
    invoke FindWindowEx,eax,0,chr$("Edit"),0 ;нашли дочернее окно - текстовое поле
    
    mov edi,eax
    
    invoke SendMessage,edi,WM_SETTEXT,0,chr$("hello") ;можно просто задать для него текст
    
    invoke SendMessage,edi,EM_SETSEL,-2,-2 ;переместим каретку в конец
    
    invoke SendMessage,edi,WM_CHAR,10,1 ;можно посимвольно слать
    invoke SendMessage,edi,WM_CHAR,'l',1
    invoke SendMessage,edi,WM_CHAR,'o',1
    invoke SendMessage,edi,WM_CHAR,'l',1
    
    invoke SendMessage,edi,EM_SETSEL,-2,-2 ;переместим каретку в конец
    invoke SendMessage,edi,EM_REPLACESEL,0,chr$(13,10,"more text") ;можно дополнить текст
    
    invoke ExitProcess,0
    end start
    
     
  3. GenTao

    GenTao New Member

    Joined:
    10 Oct 2009
    Messages:
    123
    Likes Received:
    2
    Reputations:
    -3
    Эээ...частично понятно.Человек в привате набросал такой вариант.Я его чуток переделал,чтобы работало:

    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>


    int main() {

    char my_text[6]="hello";

    HWND okay;

    okay = FindWindow(NULL,"Untitled - Notepad");
    SendMessage(okay, WM_SETFOCUS, 1, 0);
    SendMessage(okay, WM_SETTEXT, 0, (int) &my_text);
    getch();

    }

    Также вопрос - как получить хэнлд квипа или мсн ? пытаюсь по заголовку получить...кто-нить может замутить ?
     
  4. GenTao

    GenTao New Member

    Joined:
    10 Oct 2009
    Messages:
    123
    Likes Received:
    2
    Reputations:
    -3
    Мне тут подсказали,что я передаю текст родительскому окну,а не дочернему.Блин...
     
  5. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Ну понятно.
    notepad как win программа имеет главное окно а на нем так сказать подокна,т.е. элементы главного окна.

    Сначала находишь главное окно с помощью FindWindow().
    Потом уже пользуясь хендлом главного окна вызываешь функцию FindWindowEx() и так далее пока не найдешь "text box" куда пишешь текст,потом уже остатаеться послать сообщение данному "text box" - у с определенным параметром,т.е. с текстом.
    Надеюсь не слишком переборшил :D.
     
  6. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Я же сразу написал рабочий пример... Какая разница, какой язык, неужели так трудно было увидеть:

    Code:
    invoke FindWindow,chr$("Notepad"),chr$("Untitled - Notepad")
    invoke FindWindowEx,eax,0,chr$("Edit"),0 ;нашли дочернее окно - текстовое поле
    
     
    1 person likes this.
  7. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Ну я то сразу заметил то что ты закинул, а вот люди разные :)