Registriert seit: 17. Jan 2007
43 Beiträge
Delphi 2007 Professional
|
AW: Taste senden/DCOM
12. Jun 2012, 08:28
Hallo,
so, habe inzwischen (m)eine Lösung gefunden.
Das Problem war ja, dass der FindWindow und FindWindowEX nicht im DCOM-Modus funktioniert hat.
Warum weiss ich immer noch nicht.
Aus einer Eingebung heraus, habe ich das Suchen der Fenster in eine DLL ausgelagtert und da tut es...
Hier mal der Code:
Delphi-Quellcode:
procedure TCoQS.Set_eGoto(Value: Integer);
var wnd : HWND;
begin
wnd := sucheFenster(PChar(fNatName)); // Funktion aus DLL
if wnd <> 0 then
begin
SetForegroundWindow(wnd);
SendMessage(wnd, WM_CHILDACTIVATE, 0, 0); // Sonst kommen die Tasten nicht an
Sleep(200); // kurz warten
// CONTROL+G senden
Keybd_Event(VK_CONTROL,0,0,0);
Keybd_Event(byte(' G'),0,0,0);
Keybd_Event(byte(' G'),0,KEYEVENTF_KEYUP,0);
Keybd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
SendMessage(wnd, WM_SETFOCUS, 0, 0);
sleep(200); // nochmal kurz warten
// Zeilennummer im GoTo-Dialog eintragen
wnd := FindWindow(' #32770', ' Go To');
wnd := FindWindowEx(wnd, 0, ' Edit', nil);
SendMessage(wnd, WM_SETTEXT, 0, Integer(inttostr(value)));
// auf physische Zeilensuche umstellen
wnd := FindWindow(' #32770', ' Go To');
wnd := FindWindowEx(wnd, 0, ' Button', ' &Physical Line');
SendMessage(wnd,BM_CLICK,2,0);
// OK-Button drücken
wnd := FindWindow(' #32770', ' Go To');
wnd := FindWindowEx(wnd, 0, ' Button', ' OK');
SendMessage(wnd,BM_CLICK,2,0);
end
else
showmessage(' Kein Handle ermittelt');
end;
Hier die DLL
Delphi-Quellcode:
function sucheFenster(name : PChar): HWND; stdcall;
var
hWndTemp, wnd, pgm: hWnd;
iLenText: Integer;
cTitletemp: array [0..254] of Char;
sTitleTemp: string;
begin
result := 0;
wnd := FindWindow('NIDEWindowClass', nil); //Anwendung suchen
wnd := FindWindowEx(wnd, 0, 'MDIClient', nil); //unsichtbares Hintergrundfenster(was immer das auch ist...)
if wnd <> 0 then begin
// da der Fenstertitel nicht immer gleich ist...umständlich suchen...
hWndTemp := GetWindow(wnd, GW_CHILD);
while hWndTemp <> 0 do begin
iLenText := GetWindowText(hWndTemp, cTitletemp, 255);
sTitleTemp := cTitletemp;
sTitleTemp := UpperCase(copy( sTitleTemp, 1, iLenText));
if pos( name, sTitleTemp ) <> 0 then begin
result := hWndTemp;
Exit;
end;
hWndTemp := GetWindow(hWndTemp, GW_HWNDNEXT);
end;
end;
end;
falls jemand ein ähnliches Problem haben sollte...
|