[Rd] Rgui.exe 4.2.0 does not receive characters via the Windows API's PostMessage function

Tomas Kalibera tom@@@k@||ber@ @end|ng |rom gm@||@com
Wed May 11 15:39:53 CEST 2022


On 5/11/22 08:15, Tomas Kalibera wrote:
>
> On 5/11/22 03:02, jcfaria wrote:
>> Dear Tomas,
>> I've tried, but I don't have the necessary C/C++ programming skills 
>> to fulfill your request.
>>
>> Maybe someone can help us by transcribing the little code in object 
>> Pascal that I sent to C/C++.
>>
>> If a small executable, made in Object Pascal, can help in your debug, 
>> I can provide.
>
> Dear Jose,
>
> no problem, I can try out with the Pascal code.
> Is there a free compiler I can use to build and run it?

Actually I can reproduce it in a C program doing the same thing.

The primary cause is that Rgui is using GraphApp Unicode windows on 
systems running in a multi-byte locale, which affects most systems since 
R 4.2 because of the switch to UTF-8. While Unicode windows have been 
used even in older versions of R, it was only on systems then running in 
a multi-byte locale, and apparently this hasn't been reported.

When I modify R-devel to use non-Unicode GraphApp windows, the message 
sending works again. I will have a closer look, thanks for the report.

For reference, to reproduce I ran

Rgui --sdi

and used this C example:

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

int main(int argc, char **argv) {
   HWND hw;
   int i, res;

   printf("Getting Rgui window...\n");
   hw = FindWindow(NULL, "R Console (64-bit)");

   printf("Got window: %x\n", hw);
   if (hw == NULL) {
     printf("Could not get Rgui window: %x\n", GetLastError());
     return 2;
   }

   char *sd = "sd";
   for(i = 0; i < strlen(sd); i++) {
     res = PostMessage(hw, WM_CHAR, (unsigned int) sd[i], 0);
     printf("Sending char %c: %d.\n", sd[i], res);
   }

   res = PostMessage(hw, WM_KEYDOWN, VK_RETURN, 0);
   printf("Sending return: %d\n.", res);
   return 0;
}

Best
Tomas


>
> Thanks
> Tomas
>
>>
>> Grateful for the attention,,
>> ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
>> Jose Claudio Faria
>> UESC/DCET/Brasil
>> joseclaudio.faria at gmail.com
>> Telefones:
>> 55(73)3680.5545 - UESC
>> 55(73)99966.9100 - VIVO
>> ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
>> If you have software to deal with statistics, you have arms,
>> if you have good software, you have arms and legs,
>> if you have software like R, you have arms, legs and wings...
>> the height of your flight depends only on you.
>>
>> ------ Mensagem original ------
>> De: "Tomas Kalibera" <tomas.kalibera using gmail.com>
>> Para: "jcfaria" <joseclaudio.faria using gmail.com>; "Duncan Murdoch" 
>> <murdoch.duncan using gmail.com>; r-devel using r-project.org
>> Enviado(s): 06/05/2022 04:24:44
>> Assunto: Re: [Rd] Rgui.exe 4.2.0 does not receive characters via the 
>> Windows API's PostMessage function
>>
>>>
>>> On 5/6/22 07:03, jcfaria wrote:
>>>> Dear Duncan,
>>>> I believe the problem is of a different nature.
>>>> I get TRUE 3 times running the code below:
>>>>
>>>> procedure TfMain.btnPasteClick(Sender: TObject);
>>>> var
>>>>   i: integer;
>>>>   sTmp: string;
>>>>   hBN: HWND;
>>>>   j: bool;
>>>>
>>>> begin
>>>>   hBN:= FindWindowA(nil,
>>>>                     'R Console (64-bit)');
>>>>
>>>>   sTmp:= 'sd';
>>>>
>>>>   for i:= 1 to Length(sTmp) do begin
>>>>     j:= PostMessage(hBN,
>>>>                     WM_CHAR,
>>>>                     Ord(sTmp[i]),
>>>>                     0);
>>>>
>>>>     ShowMessage(BoolToStr(j,
>>>>                           True));
>>>>   end;
>>>>
>>>>   j:= PostMessage(hBN,
>>>>               WM_KEYDOWN,
>>>>               VK_RETURN, 0);
>>>>
>>>>   ShowMessage(BoolToStr(j,
>>>>                         True));
>>>> end;
>>>>
>>>> That is, Rgui is receiving the message of the characters (via 
>>>> PostMessage), but it is blocking because it does not show them in 
>>>> the console.
>>>> The only thing Rgui blames is Carriage Return, as it adds an 
>>>> additional prompt with each run.
>>>
>>> I can't provide a good guess what impacted your use, but if you 
>>> could give me a full example, ideally in C, which can be compiled 
>>> with Rtools42 (so gcc, MinGW) and I can edit/recompile, and works 
>>> with R 4.1, I am happy to help debugging on 4.2.
>>>
>>> Rgui now uses GraphApp Unicode windows on systems where it didn't 
>>> before, because it uses UTF-8 also on systems it didn't before (on 
>>> systems that would use a single-byte locale in R 4.1). These Unicode 
>>> windows are a different code path and there may be bugs not reported 
>>> previously, including processing inputs (recently I fixed handling 
>>> of accents, for example). Otherwise indeed R now uses UTF-8 as 
>>> native encoding and UCRT as the C runtime.
>>>
>>> Best
>>> Tomas
>>>
>>>
>>>>
>>>> >
>>>> >
>>>>
>>>> Best,
>>>> ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
>>>> Jose Claudio Faria
>>>> UESC/DCET/Brasil
>>>> joseclaudio.faria at gmail.com
>>>> Telefones:
>>>> 55(73)3680.5545 - UESC
>>>> 55(73)99966.9100 - VIVO
>>>> ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
>>>> If you have software to deal with statistics, you have arms,
>>>> if you have good software, you have arms and legs,
>>>> if you have software like R, you have arms, legs and wings...
>>>> the height of your flight depends only on you.
>>>>
>>>> ------ Mensagem original ------
>>>> De: "Duncan Murdoch" <murdoch.duncan using gmail.com>
>>>> Para: "jcfaria" <joseclaudio.faria using gmail.com>; r-devel using r-project.org
>>>> Enviado(s): 05/05/2022 13:17:53
>>>> Assunto: Re: [Rd] Rgui.exe 4.2.0 does not receive characters via 
>>>> the Windows API's PostMessage function
>>>>
>>>>> On 05/05/2022 11:17 a.m., jcfaria wrote:
>>>>>> Hello,
>>>>>>
>>>>>> Rgui.exe 4.2.0 does not receive characters via the Windows API's
>>>>>> PostMessage function.
>>>>>>
>>>>>> The Tinn-R project sends messages to Rgui.exe (SDI mode) via the 
>>>>>> Windows
>>>>>> API's PostMessage function.
>>>>>> A simplification of the code (in object Pascal) can be seen below.
>>>>>>
>>>>>> procedure TfMain.btnPasteClick(Sender: TObject);
>>>>>> var
>>>>>>     i: integer;
>>>>>>     sTmp: WideString;
>>>>>>     hBN: HWND;
>>>>>>
>>>>>> begin
>>>>>>     hBN:= FindWindowA(nil,
>>>>>>                       'R Console (64-bit)');
>>>>>>
>>>>>>     sTmp:= 'sd';
>>>>>>
>>>>>>     for i:= 1 to Length(sTmp) do begin
>>>>>>       PostMessage(hBN,
>>>>>>                   WM_CHAR,
>>>>>>                   Ord(sTmp[i]),
>>>>>>                   0);
>>>>>>     end;
>>>>>>
>>>>>>     PostMessage(hBN,
>>>>>>                 WM_KEYDOWN,
>>>>>>                 VK_RETURN, 0);
>>>>>> end;
>>>>>>
>>>>>> This code has always worked fine for all versions of Rgui.exe 
>>>>>> with the
>>>>>> exception of the last one released, ie 4.2.0.
>>>>>>
>>>>>> We've been trying to get around the problem on the Object Pascal 
>>>>>> side,
>>>>>> but without success so far.
>>>>>>
>>>>>> Does anyone connected to the compilation of Rqui.exe know what the
>>>>>> problem is?
>>>>>
>>>>> It could be that the new build enforces Windows security more 
>>>>> stringently.  More details are described in the answer to this 
>>>>> question: https://stackoverflow.com/a/40139498/2554330, but at a 
>>>>> minimum you should be checking the return value from PostMessage.
>>>>>
>>>>> Duncan Murdoch
>>>>>
>>>>>>
>>>>>> Best,
>>>>>> ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
>>>>>> Jose Claudio Faria
>>>>>> UESC/DCET/Brasil
>>>>>> joseclaudio.faria at gmail.com
>>>>>> Telefones:
>>>>>> 55(73)3680.5545 - UESC
>>>>>> 55(73)99966.9100 - VIVO
>>>>>> ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
>>>>>> If you have software to deal with statistics, you have arms,
>>>>>> if you have good software, you have arms and legs,
>>>>>> if you have software like R, you have arms, legs and wings...
>>>>>> the height of your flight depends only on you.
>>>>>>
>>>>>>     [[alternative HTML version deleted]]
>>>>>>
>>>>>> ______________________________________________
>>>>>> R-devel using r-project.org mailing list
>>>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>>
>>>>
>>>> ______________________________________________
>>>> R-devel using r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>



More information about the R-devel mailing list